裝飾模式 - 女屌絲逆襲白富美案例


接下來用一個女屌絲變白富美的案例,來描述裝飾模式。

一、女孩接口

首先,無論是女屌絲,還是白女孩、富女孩、美女孩,都是女孩。

所以定義女孩接口IGirl如下,其中show方法,就是女孩來展現自己現在的狀態......

public interface IGirl {
    public void show();
}

 

二、女屌絲登場

女屌絲:BaseGirl。意思就是最基礎、一無所有的女孩(女屌絲)。

show方法實現了接口,女屌絲目前一無所有,只能說:我是女孩

public class BaseGirl implements IGirl {

    public BaseGirl() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("我是女孩");
    }

}

 

三、裝飾類RichGirl:變富

女孩雖然出身貧困,但是有一顆難得的上進心,她工作努力、團結同事,終於在某公司當上了個小領導,

從此邁入了小康生活。

此時,show方法中,女孩驕傲地說:我富....

public class RichGirl implements IGirl {

    IGirl girl;
    public RichGirl(IGirl girl) {
        this.girl = girl;
    }

    @Override
    public void show() {
        //基本功能
        girl.show();
        //添加裝飾
        System.out.println("我富");
    }

}

 

四、裝飾類WhiteGirl:變白

女孩自從變有錢后,開始慢慢隨着主流開始化妝

為了讓自己皮膚變白,女孩買了好多化妝品。

此時,show方法中,女孩高興地說:我白....

public class WhiteGirl implements IGirl {

    IGirl girl;
    public WhiteGirl(IGirl girl) {
        this.girl=girl;
    }

    @Override
    public void show() {
        //基本功能
        girl.show();
        //添加裝飾
        System.out.println("我白");
    }

}

 

五、裝飾類BeautifulGirl:變美

女孩現在是又白又富,高傲氣質也自然而然的流露出來。

此時的show方法,女孩激動的說:我美...

此時,一個女屌絲不見了,一個白富美誕生了...故事也結束了...

public class BeautifulGirl implements IGirl {

    IGirl girl;
    public BeautifulGirl(IGirl girl) {
        this.girl = girl;
    }

    @Override
    public void show() {
        //基本功能
        girl.show();
        //添加裝飾
        System.out.println("我美");
    }

}

 

六、運行

流程很簡單,首先創建一個朴素女孩(gril對象),她此時show,只會說:我是一個女孩

經過三個裝飾類(白、富、美)依次裝飾,此時的女孩(gril對象),再次show的時候,已經是:我是一個女孩,我白,我富,我美

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 創建出一個朴素的女孩
        IGirl girl = new BaseGirl();
        girl.show();

        System.out.println("\n-----------------------------------\n");

        // 女孩變白了
        girl = new WhiteGirl(girl);
        girl.show();

        System.out.println("\n-----------------------------------\n");

        // 女孩變有錢了
        girl = new RichGirl(girl);
        girl.show();

        System.out.println("\n-----------------------------------\n");

        // 女孩變漂亮了
        girl = new BeautifulGirl(girl);
        girl.show();
    }

}

 

七、總結

有時候,你說人會變的,其實人真的變了。

每一次被裝飾后得到的girl,已經不是以前的girl了。

變白、換了一個人

變富、換了一個人

變美、換了一個人

此時,我們也發現,每裝飾一次,都是產生一個新的對象。

此模式非常類似於我們的字符串,A字符串:abc,如果在A前面裝飾上123,那么產生的新字符串就是123abc,而老的abc仍然在內存中等待gc回收。

因此這種設計模式缺點:大量創建對象,大量產生無用對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM