1. 程式人生 > >裝飾者模式(附與代理模式的區別,乍看挺像)

裝飾者模式(附與代理模式的區別,乍看挺像)

一.裝飾模式介紹

裝飾模式也稱為包裝模式,結構設計模式之一,就像房子一個,房子蓋好都是毛坯房,但是裝修之後,有簡單裝修,精裝修,豪華裝修,各有不同,這個就可以理解為裝飾模式,不管你怎麼裝修,最開始都是毛坯房,或者一個人每天穿不同的衣服(裝飾),但是本質還是同一個人沒有發生改變

二.裝飾模式的定義

動態的給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類而言更加簡單

三.裝飾模式的使用場景

需要透明並且動態的擴充套件類的功能時。

四.簡單實現

//Component.java

public abstract class Component {
    /**
     * 抽象的方法
     * */
    public abstract void operate();
}

//ConcreteComponent.java

public class ConcreteComponent extends  Component {
    @Override
    public void operate() {
        System.out.println("xcqw 我是小明");
    }
}

//Decorator.java

public abstract class Decorator extends Component {
    private Component component;//持有一個Component物件的引用

    /**
     * 必要的構造方法  需要一個Component型別的物件
     * */
    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        component.operate();
    }
}
//ConcreteDecoratorA.java
public class ConcreteDecoratorA extends Decorator {
    /**
     * 必要的構造方法  需要一個Component型別的物件
     *
     * @param component
     */
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        //裝飾方法A和B  (也就是帶了個帽子 ,穿了雙跑鞋)
        super.operate();
    }

    public void operateA(){
        //裝飾方法邏輯
        System.out.println("我戴了帽子");
    }

    public void operateB(){
        //裝飾方法邏輯
        System.out.println("我穿了雙跑鞋");
    }
}


 //ConcreteDecoratorB

public class ConcreteDecoratorB extends Decorator {
    /**
     * 必要的構造方法  需要一個Component型別的物件
     *
     * @param component
     */
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        //裝飾方法A和B  (也就是帶了個大金鍊子 ,穿了木屐)
        super.operate();
    }

    public void operateA(){
        //裝飾方法邏輯
        System.out.println("我帶了個大金鍊子");
    }

    public void operateB(){
        //裝飾方法邏輯
        System.out.println("我穿了木屐");
    }
}

//MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //構造被裝飾的元件物件
        Component component = new ConcreteComponent();

        //根據元件物件構造裝飾者物件A並呼叫,此時相當於給元件物件增加裝飾者A的方法
        Decorator decoratorA = new ConcreteDecoratorA(component);
        decoratorA.operate();

        //根據元件物件構造裝飾者物件B並呼叫,此時相當於給元件物件增加裝飾者B的方法
        Decorator decoratorB = new ConcreteDecoratorB(component);
        decoratorB.operate();


    }
}

結果可以看到  一個是戴帽子穿跑鞋的小明,一個則是代金鍊子,穿木屐的小明,著裝風格不一樣,但是都是小明

Component:抽象元件

可以是一個介面或者抽象類,其充當的就是被裝飾的原始物件

ConcreteComponent:元件具體實現類

該類是Component類的基本實現,也就是我們裝飾的具體物件(也就是小明

Decorator:抽象裝飾者

裝飾我們的元件物件,其內部一定要有一個指向元件物件的引用。

ConcreteDecorateA:裝飾著具體實現類

只是對抽象裝飾著作出具體的實現(具體擴充套件的方法,精裝修還是豪華裝修

ConcreteDecorateB:裝飾著具體實現類

只是對抽象裝飾著作出具體的實現(具體擴充套件的方法,精裝修還是豪華裝修

Client :客戶類

五.Android原始碼中的模式實現

在Android中常用的Context就使用了裝飾者模式,看圖就很清晰了


六.跟代理模式的區別

一句話,裝飾者模式是增強物件功能(穿不同的衣服),代理模式是控制代理的物件,但不對其做功能增加