設計思想學習—裝飾者模式

裝飾者模式

Decorator模式(別名Wrapper):動態將職責附加到對象上,若要擴展功能,裝飾者提供了比繼承更具彈性的代替方案。

UML圖
取自大話設計模式

裝飾者包含四個基本類

  • 抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。

  • 具體構件角色(Concrete Component):定義將要接收附加責任的類。

  • 裝飾角色(Decorator):持有一個構件(Component)對象的引用,並定義一個與抽象構件接口一致的接口。

  • 具體裝飾角色(Concrete Decorator):負責給構件對象“貼上”附加的責任。

舉個栗子
裝飾者模式跟玩芭比娃娃有點像
Component就像是芭比娃娃玩具(外面的包裝)
ConcreteComponent就好比剛剛從包裝裏面拿出來的芭比娃娃
Decorator就好比放芭比衣服和裝飾的盒子
下面具體的實現就是芭比的衣服、頭髮之類的裝飾。
然後就拿起芭比娃娃給她穿衣服、帶頭髮就好了

//整套芭比娃娃玩具
interface Component{
    void toDo();
}
//芭比娃娃實體
class ConcreteComponent implements Component{
    @Override
    public void toDo() {
        System.out.println("我是芭比娃娃");
    }

}
//裝飾箱
class Decorator implements Component{
    private Component component;
    public Decorator(Component component){
        this.component=component;
    }
    @Override
    public void toDo() {
        component.toDo();
    }

}
//芭比的衣服
class Clothes extends Decorator{
    public Clothes (Component component) {
        super(component);
    }
    @Override
    public void toDo() {
        super.toDo();
        System.out.println("穿上衣服");
    }
}
//芭比的鞋子
class Shoe extends Decorator{

    public Shoe (Component component) {
        super(component);
    }
    @Override
    public void toDo() {
        super.toDo();
        System.out.println("穿鞋子");
    }
}
public class Client {
    public static void main(String[] args){
        Component cct=new ConcreteComponent();
        cct=new Shoe (new Clothes (cct));
        cct.toDo();
    }
}
/*輸出
我是芭比娃娃
穿上衣服
穿鞋子
*/

顯而易見的是被裝飾類在編譯的只有主要的一些功能,而在運行的時候卻可以動態的給它加上其他的功能職責,而且繼續增加其他的職責也不需要改動原類,只需要繼續增加裝飾類即可,完美實現了開閉原則。還有一個優點是這種動態增加比繼承要靈活許多。

有意思的是當我看到這句代碼的時候

cct=new Shoe (new Clothes (cct));

我突然發現跟我們的IO流太像了,經過查找資料發現,io正是運用了裝飾者模式的一個典型例子,上圖

這裏寫圖片描述

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