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



 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			