淺談裝飾者模式的簡單使用和思路

說到裝飾者模式很多人都感覺很難理解,到底什麼是所謂的裝飾?

在這裏,我先談一談我個人的理解吧。

所謂裝飾,那就是在不改變原先狀態的情況下,給某個對象或者說某個東西添加一些的額外的屬性,來增加其使用,前提一定是不影響原先的結構,給原先的狀態增加一些擴展性,從網上也查找了很多關於裝飾者模式的使用和介紹,但是,太過於官方了,實在是看不太懂,只能按照自己的理解來寫這一篇文章了。

說到這裏我先寫一個例子:

先描述一下基本的三個基本:

1,接口,

2,接口的實現類

3,包裝了實現類的裝飾類。


那麼我們先創建一個接口,比如,我們需要一個打電話的基本功能。我們在接口中創建一個描述方法用來對功能進行描述:


接着創建兩個實現類,實現這個電話類:


public interface IPhone{

String Decribe();

}


創建電話類:android手機類,蘋果手機類

public class AndroidPhone implement IPhone{

@override

public Stirng Describe(){

return "安卓手機可以打電話";

}

}


public class ApplePhone implement IPhone{

@override

public String Descibe(){

return “蘋果手機可以打電話”;

}

}


這樣兩個類就實現了,接下來,我們需要對兩個類進行包裝,在不失去基本功能的前提下,將他們裝飾起來,好的創建一個裝飾類,


public class ZSPhone implement IPhone{

private IPhone mPhone;

public ZSPhone (Iphone phone){

this.mPhone=phone;

}

@ovverride

public String Describe(){

return mPhone.call();

}


}


這樣就完成了,現在我們來分析一下這樣寫的好處和爲什麼要這樣寫?


我們只需要在調用的時候這樣調用

ZSPhone zdPhone=new ZSPhone(new AndroidPhone() );

zdPhone.Call(); 

ZSPhone zsPhone=new ZSPhone(ApplePhone());

ZdPhone.Call();

因爲他的返回值是調用的其參數對象的call方法,所以,這樣並未影響到其本身的功能。只是我們需要用裝飾類來調用而已。


首先,如果有多個電話種類想要實現打電話的功能其實很簡單,只需要將所有的電話種類實現上邊的接口即可,我們這樣寫是不是多此一舉呢??????


我們之所以這樣寫是爲了以後的擴展性,比方說,我後來又需要發短信的功能,我需要創造四個不同類型的手機,一個具有打電話,發彩信的android手機,一個打電話發短信的android手機,一個打電話發短信的蘋果手機,一個打電話發彩信的蘋果手機,那麼如何實現呢???


如果我們再創建發短信的接口,和發彩信的接口,讓他們繼承,但是,少的話可以這樣,如果有多個種類的手機需要這樣咋辦,那不得敲代碼敲死???速度還慢》

》》》》》》》簡單的方法來了,如果我們再用同樣的方式,將上邊的在進行一下包裝,



創建短信類,繼承自上邊的裝飾類,這樣他也具有了描述的功能:在構造中調用父類的構造,

public class ColorMessage extands ZSPhone{

public ColorMessae(IPnhe phone){

super(phone)

}

//調用了父類的構造後,在重寫的方法中,再調用返回父類的打電話功能後,給他補充上發彩信的功能,這樣就完成一個,下面我們分別爲完成剩下的一個吧?

@Override

public String Decrible(){

return super.decrible()+"發彩信的功能"

}

}


public class ShortMessage extands ZSPhone{

public ShortMessae(IPnhe phone){

super(phone)

}

@Override

public String Decrible(){

return super.decrible()+"發短息的功能"

}

}


這樣我們只需要再點用的時候多次扮裝就可以了:如下

ZSPhone zdPhone=new ZSPhone(new AndroidPhone(new ColorMessage()) );

zdPhone.Call(); 

ZSPhone zsPhone=new ZSPhone(ApplePhone(new ColorMesage()));

ZdPhone.Call();

ZSPhone zdPhone=new ZSPhone(new AndroidPhone(New ShortMessage()) );

zdPhone.Call(); 

ZSPhone zsPhone=new ZSPhone(ApplePhone(new ShortMessage()));

ZdPhone.Call();

這樣就通過構造函數中對父類的層層調用,再重寫的的方法中對父類的層層補充,既可以完成功能的擴展,而且還能夠不影響原本的功能。


下邊,我出一道題,如何在上邊的方法中,將電話的功能再補充上玩單機遊戲和網絡遊戲的功能??大家可以根據上邊的試一試。









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