裝飾者模式
裝飾器模式(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();
}
}
執行結果:
----- 您好,這邊是調料自選區,可以按照您的口味選擇自己喜歡的口味 -----
---加辣椒---
---加蒜---
---加油---