設計模式裝飾模式例子:裝飾者設計模式功能

裝飾者模式

裝飾器模式(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-tw/n/224610.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:39
下一篇 2024-12-09 14:39

相關推薦

發表回復

登錄後才能評論