裝飾器設計模式 - Gene Zeiniss

banq發表於2020-06-03

裝飾器模式可以使用聚合來組合執行時的行為。“聚合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專案連結

 

相關文章