說到裝飾者模式很多人都感覺很難理解,到底什麼是所謂的裝飾?
在這裏,我先談一談我個人的理解吧。
所謂裝飾,那就是在不改變原先狀態的情況下,給某個對象或者說某個東西添加一些的額外的屬性,來增加其使用,前提一定是不影響原先的結構,給原先的狀態增加一些擴展性,從網上也查找了很多關於裝飾者模式的使用和介紹,但是,太過於官方了,實在是看不太懂,只能按照自己的理解來寫這一篇文章了。
說到這裏我先寫一個例子:
先描述一下基本的三個基本:
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();
這樣就通過構造函數中對父類的層層調用,再重寫的的方法中對父類的層層補充,既可以完成功能的擴展,而且還能夠不影響原本的功能。
下邊,我出一道題,如何在上邊的方法中,將電話的功能再補充上玩單機遊戲和網絡遊戲的功能??大家可以根據上邊的試一試。