一天一種設計模式之七-----裝飾模式

一.裝飾模式定義

  1. 裝飾模式屬於結構型模式  
    java

  2.  裝飾模式動態的給一個對象添加一些額外的職責。就增長功能來講,decorator模式相比生成子類更加靈活
    ide

  3. 適用性測試

    1. 在不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責this

    2. 處理那些能夠撤銷的職責spa

    3. 當不能採用生成子類的方法進行填充時。指針

  4. 結構:code

    1. Component定義一個對象接口,能夠給這些對象動態的添加職責。component

    2. ConcreteComponent定義一個對象,能夠給這個對象添加一些職責。對象

    3. Decorator維持一個紙箱Component對象的指針,並定義一個與Component接口一致的接口。繼承

    4. ConcreteDecorator向組件添加職責。

  5. 好處

    1. 把類的核心職責和裝飾功能區分開了。能夠去除相關類中的重複的裝飾邏輯。裝飾類之間要彼此獨立。

    2. 比繼承更多的靈活性。

    3. 在運行時選擇不一樣的裝飾器,擴展對象的功能,增長了靈活性。

    4. 經過裝飾類的排列組合,能夠創造出不一樣行爲組合,獲得功能更強大的對象。

  6. 缺點

    1. 順序很重要,不留神可能會出現遞歸死循環的狀況。

    2. 會產生不少小對象,增長了系統複雜性。

    3. 出錯時,逐級排查可能會很麻煩(因此不一樣裝飾器必定要負責不一樣的行爲,這樣便於區分)

  7. 符合開閉原則。迪米特法則。

  8.  我的 感受裝飾模式就是把聲明好的類當作另外一個類的元素,遞歸的調用全部父元素到子元素的同一個方法。

  9. BufferedReader等io流用的就是裝飾模式,有興趣的小夥伴能夠看看源碼研究下。

   

二.測試代碼

  1.     測試代碼1以下,

public class ZhuangshiMoshiTest2 {
    public static void main(String[] args) {
        Man man=new Man();
        ManDecoratorA decoratorA=new ManDecoratorA();
        ManDecoratorB decoratorB=new ManDecoratorB();
        decoratorA.setPerson(man);
        decoratorB.setPerson(decoratorA);
        decoratorB.eat();
    }
}
interface Human{
    void eat();
}
class Man implements Human{
    @Override
    public void eat() {
        System.out.println("男人在吃");
    }
}
abstract class Decorator implements Human{
    protected Human person;
    public void setPerson(Human person) {
        this.person = person;
    }
    @Override
    public void eat() {
        person.eat();
    }
}
class ManDecoratorA extends Decorator{
    @Override
    public void eat() {
        super.eat();
        reEat();
    }

    private void reEat() {
        System.out.println("再吃頓");
    }
}
class ManDecoratorB extends Decorator{
    @Override
    public void eat() {
        super.eat();
        System.out.println("=====");
        System.out.println("B");
    }
}

    2.測試代碼2以下

public class ZhuangshimoshiTest {
    public static void main(String[] args) {
        ConcreateComponent component = new ConcreateComponent() {
        };
        ConcreateComponent component2 = new ConcreateDecorationA();
        ConcreateComponent component3 = new ConcreateDecorationB();
        component2.setComponent(component);
        component3.setComponent(component2);
        component3.operation();
    }
}

abstract class Component {
    public abstract void operation();
}

abstract class ConcreateComponent extends Component {
    protected Component component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if (component != null) {
            component.operation();
        }
    }
}

class ConcreateDecorationA extends ConcreateComponent {
    private String addedState;// 本類獨有的成員,能夠區別去其餘類

    @Override
    public void operation() {
        super.operation();
        addedState = "New state";
        System.out.println("裝飾類A進行裝飾");
    }
}

class ConcreateDecorationB extends ConcreateComponent {
    @Override
    public void operation() {
        super.operation();
        addMethod();
        System.out.println("裝飾類B進行裝飾");
    }

    private void addMethod() {// 類B獨有的方式,能夠區別其餘類

    }
}

3.組合模式和裝飾模式同屬結構型模式,組合模式是一種樹形結構,而裝飾者模式是一種鏈表結構。感受有一點類似。下節會介紹組合模式以及組合模式與裝飾模式的區別。

4.命令模式、職責鏈模式雖然屬於行爲型模式,但他們和裝飾模式也有一點類似。後面也會一一介紹。敬請期待。

5.最近動力有點不足,沒有作到一天一篇,自責下。另外在公司一直在作些改改模版增刪改查的東西,事情不少尚未含金量,因此很煩。不忘初心吧。共勉。

相關文章
相關標籤/搜索