設計模式():裝飾模式

概念

動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生存子類更爲靈活。
使用裝飾模式時,將上一步裝飾地結果作爲參數傳入到下一步地裝飾中。

代碼

要裝飾的對象

public  class SunWukong {
    public  void show(){
    }
}

抽象的裝飾類

public abstract class Finery extends SunWukong {
    protected SunWukong sunWukong;

    public void decorate(SunWukong sunWukong){
        this.sunWukong = sunWukong;
    }

    @Override
    public void show() {
        if (this.sunWukong != null) {
            this.sunWukong.show();
        }
    }
}

具體的裝飾類一

public class HupiSkirt extends Finery {
    @Override
    public void show() {
        this.sunWukong.show();
        System.out.println("穿上了虎皮裙");
    }
}

具體的裝飾類二

public class JinguStick extends Finery {

    @Override
    public void show() {
        sunWukong.show();
        System.out.println("拿起了金箍棒");
    }
}

具體的裝飾類三

public class ZijinCrown extends Finery {
      @Override
    public void show() {
        sunWukong.show();
        System.out.println("戴上了紫金冠");
    }
}

開始裝飾

public class Client  {
    public static void main(String[] args) {
        SunWukong sunWukong = new SunWukong();

        HupiSkirt hupiSkirt = new HupiSkirt();
        JinguStick jinguStick = new JinguStick();
        ZijinCrown zijinCrown = new ZijinCrown();

        System.out.println("+++++穿戴一+++++");
        hupiSkirt.decorate(sunWukong);
        jinguStick.decorate(hupiSkirt);
        zijinCrown.decorate(jinguStick);
        zijinCrown.show();

        System.out.println("+++++穿戴二+++++");
        zijinCrown.decorate(sunWukong);
        hupiSkirt.decorate(zijinCrown);
        jinguStick.decorate(hupiSkirt);
        jinguStick.show();
    }
}
//        +++++穿戴一+++++
//        穿上了虎皮裙
//        拿起了金箍棒
//        戴上了紫金冠
//        +++++穿戴一+++++
//        戴上了紫金冠
//        穿上了虎皮裙
//        拿起了金箍棒

特點

使用裝飾模式裝飾對象時,不需要事先知道裝飾的順序,因此可以動態地裝飾對象。

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