【設計模式】(十二)--結構型模式--裝飾器模式

【設計模式】(十二)–結構型模式–裝飾器模式

裝飾器模式定義

Attach additional responsibilities to an object dynamically keeping the same interface Decorators provide a flexible alternative to subclassing for extending funcionality.

意思是:動態的給一個對象添加一些額外的職責。就增加功能來看,裝飾器模式比生成子類更加靈活。
裝飾器模式一般有4個角色

  • 抽象類 功能抽象接口,定義功能約束
  • 被裝飾的原始類 抽象類的實現,在裝飾器模式中將被裝飾
  • 裝飾基類 持有被裝飾原始類的對象,並且繼承了抽象
  • 具體裝飾類 實現了裝飾基類,對被撞死的原始類進行裝飾

裝飾器模式優點

  • 裝飾類和被裝飾類可以獨立發展,不會相互耦合。
  • 裝飾器模式是繼承的一個替代模式
  • 裝飾器模式可以動態擴展一個實現類的功能。
    但是裝飾器模式的實際上從抽象類到具體裝飾類已經多次繼承實現,在多層的裝飾上會更復雜。

裝飾器模式的使用場景

  • 1、擴展一個類的功能。 或者增加一個類的附加功能
  • 2、動態增加功能,動態撤銷。

與代理模式對比1

讓別人幫助你做你並不關心的事情,叫代理模式。爲讓自己的能力增強,使得增強後的自己能夠使用更多的方法,拓展在自己基礎之上的功能的,叫裝飾器模式。
對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實現同一個 接口。對代理模式來說,代理類(proxy class)和真實處理的類(real class)都實現同一個接口。他們之間的邊界確實比較模糊,兩者都是對類的方法進行擴展,具體區別如下:

1、裝飾器模式強調的是增強自身,在被裝飾之後你能夠在被增強的類上使用增強後的功能。增強後你還是你,只不過能力更強了而已;代理模式強調要讓別人幫你去做一些本身與你業務沒有太多關係的職責(記錄日誌、設置緩存)。代理模式是爲了實現對象的控制,因爲被代理的對象往往難以直接獲得或者是其內部不想暴露出來。

2、裝飾模式是以對客戶端透明的方式擴展對象的功能,是繼承方案的一個替代方案;代理模式則是給一個對象提供一個代理對象,並由代理對象來控制對原有對象的引用;

3、裝飾模式是爲裝飾的對象增強功能;而代理模式對代理的對象施加控制,但不對對象本身的功能進行增強;

接上篇,代理模式。在點火開火時,使用代理模式開煤氣,關煤氣,並沒有增強煤氣竈的功能。接下來簡單的實現裝飾器模式,將給煤氣竈增強,加上烤架,讓煤氣竈還能給烤肉。這不春節太饞的日常嗎?

簡單的實現

類圖
在這裏插入圖片描述

實現

public class ConcreteCookerDecorator extends CookerDecorator {
    public ConcreteCookerDecorator(Cooker cooker) {
        super(cooker);
    }

    private void barbecue() {
        System.out.println("各就各位,烤肉走起。");
    }

    private void addGridiron() {
        System.out.println("上烤架!");
    }

    private void removeGridiron() {
        System.out.println("撤烤架!");
    }

    @Override
    public void start() {
        super.start();
        this.addGridiron();
        this.barbecue();
    }

    @Override
    public void stop() {
        super.stop();
        this.removeGridiron();
    }

    public static void main(String[] args) {
        Cooker gasCooker = new GasCooker();
        CookerDecorator cookerDecorator = new ConcreteCookerDecorator(gasCooker);
        cookerDecorator.start();
        cookerDecorator.stop();
    }
}
public abstract class CookerDecorator implements Cooker {

    private Cooker cooker = null;

    public CookerDecorator(Cooker cooker) {
        this.cooker = cooker;
    }

    @Override
    public void start() {
        cooker.start();
    }

    @Override
    public void stop() {
        cooker.stop();
    }
}
public class GasCooker implements Cooker {
    @Override
    public void start() {
        System.out.println("煤氣竈點火成功!!");
    }

    @Override
    public void stop() {
        System.out.println("結束,關火!");
    }
}
public interface Cooker {
    void start();

    void stop();
}

結果
在這裏插入圖片描述


  1. 代理模式和裝飾器模式的區別(https://zhuanlan.zhihu.com/p/97499017) ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章