裝飾器設計模式 - Gene Zeiniss
裝飾器模式可以使用聚合來組合執行時的行為。“聚合aggregation是將事物或數量組合為單個組或總計的過程”。聚合的同義詞之一是“堆heap”,堆是“雜亂的堆或大量的東西”。我認為這個定義還可以。對我來說只有一件事毀了它。如果聚合是一個過程,而堆(一個不整潔的堆)是該過程的結果,那麼為什麼這兩個詞是同義詞?
Java語言中的抽象
在Java中,聚合更為簡單。這是由單向關聯表示的類之間的關係。堆是聚合的體現。
看一看。這是一個物件。它具有型別和名稱。它可以存在。
@Builder public class Thing { String type; String name; } |
這是堆。它有一個高度(大堆/巨大……)和位置,但是沒有Thing它就不可能存在。
@Data public class Heap { private String height; private String location; private List<Thing> thing; } |
僅當您擁有衣服之類的東西Thing時,您才能建立一堆heap衣服。扒開層層衣服並將它們不整潔地扔在地板上
public Heap createHeapOfClothes() { Heap heap = new Heap(); heap.setHeight("huge"); heap.setLocation("on the bathroom floor"); heap.setThing(Arrays.asList( Thing.builder().type("clothes").name("t-shirt").build(), Thing.builder().type("clothes").name("jeans").build(), Thing.builder().type("clothes").name("right sock").build(), Thing.builder().type("clothes").name("left sock").build())); return heap; } |
我不只是提出聚合。裝飾器模式可以使用聚合來組合執行時的行為。
裝飾器模式
裝飾器模式是一種設計模式,它允許動態地將行為新增到單個物件中,而不會影響同一類中其他物件的行為。這是一種結構模式,透過圍繞物件構造包裝來擴充套件其行為。考慮一下分層服裝。每層都是裝飾器,包裝上一層。
基礎類:
public class AutumnOutfit extends Outfit { @Override public void describeTop() { log.info("white sweater"); } @Override public void describeBottom() { log.info("ripped jeans"); } @Override public void describeFootwear() { log.info("veja sneakers"); } } |
現在,您需要一個Outwear Decorator,以使用聚合將更多服裝新增到基本服裝中。您將需要使用抽象裝飾器類的子類來新增到基本服裝中。正如我們之前所探討的,“服裝裝飾器”是“服裝”的子類。因此,混凝土裝飾師也是服裝的子類。
@RequiredArgsConstructor public abstract class OuterwearDecorator extends Outfit { public abstract void describeOuterwear(); @Override public void createDailyLook() { describeTop(); describeBottom(); describeFootwear(); describeOuterwear(); drawDescribedOutfit(); cutDrawnOutfit(); } } |
基本裝飾器擁有新的抽象行為describeOuterwear(),它將由具體裝飾器實現。並且,它覆蓋了該createDailyLook()方法。
下一步是實現抽象方法。建立一個混凝土外套裝飾器。
@RequiredArgsConstructor public class CoatDecorator extends OuterwearDecorator { private final Outfit outfit; @Override public void describeOuterwear() { log.info("camel coat");} @Override public void describeTop() { outfit.describeTop();} @Override public void describeBottom() { outfit.describeBottom();} @Override public void describeFootwear() { outfit.describeFootwear(); } } |
裝飾器類的行為就像實現抽象方法的另一個類一樣。唯一的區別是,它聚合了基類。它將允許將一些行為堆疊在一起。
呼叫程式碼:
public void createAutumnOutfitWithCoat() { Outfit autumnOutfit = seasonOutfitFactory.createOutfit(Season.AUTUMN); autumnOutfit = new CoatDecorator(autumnOutfit); autumnOutfit.createDailyLook(); } |
重要的是基本服裝必須是堆heap中的第一件。接下來,將其包裹在外套裝飾器中。然後呼叫該createDailyLook()方法,以繪製和剪下所描述的服裝。您的抽象裝飾器只需將每日外觀建立委託給它聚合的Outfit物件。檢查日誌。執行結果:
AutumnOutfit - white sweater AutumnOutfit - ripped jeans AutumnOutfit - veja sneakers CoatDecorator - camel coat Outfit - drawing outfit according to selections Outfit - cutting drawn outfit |
這是這篇文章的git專案的連結
相關文章
- 設計模式----裝飾器模式設計模式
- 設計模式-裝飾器模式設計模式
- [設計模式] 裝飾器模式設計模式
- Python設計模式-裝飾器模式Python設計模式
- 設計模式之-裝飾器模式設計模式
- 設計模式(八)裝飾器模式設計模式
- java設計模式--裝飾器模式Java設計模式
- 設計模式(六):裝飾器模式設計模式
- 設計模式之【裝飾器模式】設計模式
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- Go 設計模式之裝飾器模式Go設計模式
- Java 設計模式(五)《裝飾器模式》Java設計模式
- java設計模式之裝飾器模式Java設計模式
- Java設計模式系列-裝飾器模式Java設計模式
- Java學設計模式之裝飾器模式Java設計模式
- 設計模式專題(七)裝飾器模式設計模式
- 【趣味設計模式系列】之【裝飾器模式】設計模式
- 設計模式之裝飾器模式(decorator pattern)設計模式
- 23種設計模式(三)--裝飾器模式設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- 設計模式——裝飾模式設計模式
- 設計模式-裝飾模式設計模式
- 裝飾設計模式設計模式
- c++設計模式-裝飾器模式和代理模式C++設計模式
- 設計模式 #4 (裝飾器模式、介面卡模式)設計模式
- 原始碼中的設計模式--裝飾器模式原始碼設計模式
- C#設計模式-裝飾器模式(Decorator Pattern)C#設計模式
- 設計模式——裝飾者模式設計模式
- 設計模式-裝飾者模式設計模式
- [設計模式]裝飾者模式設計模式
- Decorator裝飾設計模式設計模式
- 前端常用設計模式(1)--裝飾器(decorator)前端設計模式
- 設計模式【8】-- 手工耿教我寫裝飾器模式設計模式
- 設計模式系列之「裝飾模式」設計模式
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 小白設計模式:裝飾者模式設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- 軟體設計模式————(裝飾模式)設計模式