裝飾者模式
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,是一種用於代替繼承的技術,無需通過繼承增加子類就能擴展對象的新功能。使用對象的關聯關係代替繼承關係,更加靈活,同時避免類型體系的快速膨脹;
主要角色:
- 組件(Component):組件接口定義了全部組件類和裝飾器實現的行為;
- 組件實現類(ConcreteComponent):實現Component接口,組件實現類就是被裝飾器裝飾的原始對象,新功能或者附加功能都是通過裝飾器添加到該類的對象上的;
- 裝飾器抽象類(Decorator):實現Component接口的抽象類,在其中封裝了一個Component 對象, 也就是被裝飾的對象;
- 具體裝飾器類(ConcreteDecorator):該實現類要向被裝飾的對象添加某些功能;
類圖:

看具體的例子,就拿去火鍋店吃火鍋拌蘸料這個來說。
蘸料有很多:
而每個人的口味又不一樣。所以組合就非常多。這種情況下如果使用裝飾着模式來實現看看。
第一步
首先我們有一個行為拌蘸料(Component)
/**
* @Author: jimmy
* @Description:
* 裝飾着模式 -
* 組件(Component):組件接口定義了全部組件類和裝飾器實現的行為;
*/
public interface AllocatSeasoning {
void allo();
}
接下來,按照上面裝飾者的模型進行分析,我們需要2個類來實現上面的行為
第二步
第一個類(ConcreteComponent)可以理解為裝拌料的碗,後面的加蘸料都放到這個碗裡面
/**
* @Author: jimmy
* @Description:
* 組件實現類(ConcreteComponent):
* 實現Component接口,組件實現類就是被裝飾器裝飾的原始對象,
* 新功能或者附加功能都是通過裝飾器添加到該類的對象上的;
*
* 可以把這個理解為裝拌料的碗
*/
public class AllocDo implements AllocatSeasoning{
@Override
public void allo() {
System.out.println("----- 您好,這邊是調料自選區,可以按照您的口味選擇自己喜歡的口味 -----");
}
}
第三步
第二個類,這個類可以理解為抽象
/**
* @Author: jimmy
* @Description:
* 裝飾器抽象類(Decorator):
* 實現Component接口的抽象類,在其中封裝了一個Component 對象,
* 也就是被裝飾的對象;
*
* 這個對象可以理解為已經準備好了,要去拿蘸料的動作的父級。
* AllocatSeasoning可以理解為 蘸料和婉的合體。
*/
public class AllocDecorator implements AllocatSeasoning{
// 持有對象
private AllocatSeasoning allocatSeasoning;
// 構造器
public AllocDecorator(AllocatSeasoning allocatSeasoning) {
this.allocatSeasoning = allocatSeasoning;
}
// 調用對下個對應的方法
@Override
public void allo() {
allocatSeasoning.allo();
}
}
第四步
放具體的蘸料(ConcreteDecorator)這裡說白了就是 拿着放有蘸料的碗(可以是空碗)來放現在想放的蘸料。我這裡只給出了一個具體類,其他的有興趣可以把代碼複製,然後補充下。
/**
* @Author: jimmy
* @Description:
* 具體裝飾器類(ConcreteDecorator):該實現類要向被裝飾的對象添加某些功能;
* 這裡說白了就是 拿着放有蘸料的碗(可以是空碗)來放現在想放的蘸料
*/
public class GarlicAlloc extends AllocDecorator{
public GarlicAlloc(AllocatSeasoning allocatSeasoning) {
super(allocatSeasoning);
}
@Override
public void allo() {
// 調用原有業務方法
super.allo();
// 補充我們這個行為的方法
addGarlic();
}
public void addGarlic() {
System.out.println("---加蒜---");
}
}
測試類
public class DecoratorClinet {
public static void main(String[] args) {
AllocatSeasoning a = new OilAlloc(new GarlicAlloc(new ChilliAlloc(new AllocDo())));
a.allo();
}
}
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/224610.html