接下來用一個女屌絲變白富美的案例,來描述裝飾模式。
一、女孩接口
首先,無論是女屌絲,還是白女孩、富女孩、美女孩,都是女孩。
所以定義女孩接口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回收。
因此這種設計模式缺點:大量創建對象,大量產生無用對象。