Java中的装饰器设计模式
裝飾器設(shè)計(jì)模式允許在運(yùn)行時(shí)將附加職責(zé)或行為動(dòng)態(tài)附加到對(duì)象。 它是一種結(jié)構(gòu)模式,利用聚合來(lái)組合這些行為。
在本教程中,我們將學(xué)習(xí)實(shí)現(xiàn)裝飾器模式。
UML圖:
讓我們從裝飾器模式的UML表示開(kāi)始:
ConcreteComponent類是我們希望為其在運(yùn)行時(shí)添加其他行為的類。 ConcreteDecorator1 , ConcreteDecorator2 ,…是裝飾器類,它們包含裝飾給定Component的邏輯。
請(qǐng)注意, 抽象 Decorator類'具有' 組件。 換句話說(shuō),它聚合了任何其他類型的組件,這使我們可以將一個(gè)組件堆疊在另一個(gè)組件的頂部。
此外, ConcreteComponent和Decorator類都實(shí)現(xiàn)一個(gè)公共接口Component 。
示例實(shí)現(xiàn):
假設(shè)我們正在銷售禮品。 一旦用戶選擇了禮物項(xiàng)目,就有多種方法可以用紅色或藍(lán)色絲帶,紫色或綠色禮物包裝紙等裝飾該禮物項(xiàng)目。
與其為每個(gè)可能的組合創(chuàng)建一個(gè)類,不如使用裝飾器模式來(lái)實(shí)現(xiàn)它。
因此,讓我們創(chuàng)建我們的GiftComponent接口:
public interface GiftComponent { void pack(); }此外,讓我們編寫GiftItem類,這是GiftComponent的具體實(shí)現(xiàn):
public class GiftItem implements GiftComponent { ?public void pack() { System.out.println( "Putting it in a box" ); } }實(shí)現(xiàn)抽象裝飾器:
現(xiàn)在,我們有一個(gè)GiftItem,我們會(huì)喜歡裝飾,讓我們來(lái)定義抽象GiftDecorator類:
public abstract AbstractGiftDecorator implements GiftComponent { protected GiftComponent gift; ?public AbstractGiftDecorator(GiftComponent gift) { this .gift = gift; } ????public void pack() { this .gift.pack(); } }禮物裝飾器具有禮物組件的單個(gè)實(shí)例。 這樣就可以將裝飾器彼此堆疊。
創(chuàng)建多個(gè)裝飾器:
最后,我們可以根據(jù)需要?jiǎng)?chuàng)建任意數(shù)量的自定義裝飾器。
讓我們創(chuàng)建一些禮品包裝:
public class PurpleWrapper extends AbstractGiftDecorator { ?public PurpleWrapper(GiftComponent gift) { super (gift); } ?public void pack() { super .pack(); System.out.println( "Purple wrapper" ); } } ? public class RedWrapper extends AbstractGiftDecorator { ?public RedWrapper(GiftComponent gift) { super (gift); } ?public void pack() { super .pack(); System.out.println( "Red wrapper" ); } }以及幾種用于進(jìn)一步裝飾的色帶:
public class BlueRibbon extends AbstractDecorator { ?public BlueRibbon(GiftComponent gift) { super (gift); } ?public void pack() { super .pack(); System.out.println( "Blue ribbon" ); } } ? public class PinkRibbon extends AbstractDecorator { ?public PinkRibbon(GiftComponent gift) { super (gift); } ?public void pack() { super .pack(); System.out.println( "Pink Ribbon" ); } }測(cè)試我們的實(shí)施:
現(xiàn)在讓我們測(cè)試一下實(shí)現(xiàn),看看會(huì)發(fā)生什么:
// client code GiftComponent gift = new GiftItem(); GiftComponent giftWithPurpleWrapper = new PurpleWrapper(gift); GiftComponent giftWithPurpleWrapperAndPinkRibbon = new PinkRibbon(giftWithPurpleWrapper); ? giftWithPurpleWrapperAndPinkRibbon.pack();如我們所見(jiàn),我們現(xiàn)在可以通過(guò)鏈接裝飾器輕松,優(yōu)雅地按照我們想要的方式包裝禮品。 上面的代碼將打印:
Putting it in a box Purple Wrapper Pink Ribbon結(jié)論:
裝飾器設(shè)計(jì)模式使用聚合來(lái)代替純繼承。 它允許我們向?qū)ο髣?dòng)態(tài)添加行為。 它消除了為每種可能的組合創(chuàng)建單獨(dú)的類的開(kāi)銷,從而大大減少了類的數(shù)量。
而且,它遵循單一責(zé)任原則 ,該原則規(guī)定每個(gè)班級(jí)必須準(zhǔn)確地做一件事。 使用裝飾器設(shè)計(jì)模式設(shè)計(jì)java.io.BufferedReader,java.io.FileReader之類的類 。
翻譯自: https://www.javacodegeeks.com/2019/09/decorator-design-pattern-in-java.html
總結(jié)
以上是生活随笔為你收集整理的Java中的装饰器设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ddos反射攻击原理(ddos 反射攻击
- 下一篇: Java中的复合设计模式