資源描述:
《設計模式 (十)裝飾模式(Decorator)》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、設計模式(十)裝飾模式(Decorator)裝飾模式(Decorator)就是使用被裝飾的一個子類的實例,在客戶端將這個子類的實例委托給裝飾類。裝飾模式是結成關系的一個替代方案。簡單的裝飾模式是原理圖入下:裝飾模式以對客服端透明的方式增添了對象的功能,其在與動態(tài)的給對象添加了責任,當然這里的繼承便是靜態(tài)的。其中重要的地方時裝飾對象和真是對象有相同的接口,這樣客戶端就可以和真是對象一樣的交互方式和裝飾對象交互,然后裝飾對象把所有從客戶端接收過來的請求全部轉發(fā)給真是對象,然后在返還給客戶端,這樣裝飾對象就可以再轉發(fā)
2、前或者以后添加一些附加功能而不影響對真是對象的操作,這樣在不改變原有類的基礎想,可以實現(xiàn)對于原有類的這種額外功能的實現(xiàn),增強了程序的復用性。同時裝飾模式比繼承好的地方就是,裝飾模式可以動態(tài)的對已經(jīng)存在的類進行任意的組合,實現(xiàn)想要的功能,而繼承是靜態(tài)的實現(xiàn),不能改變原有類的實現(xiàn),如果要添加更多的功能,只有添加更多的派生類來實現(xiàn),這個簡潔在下面的例子里對于最后一次打印輸出就有很明顯的效果,定義好了兩個裝飾類以后,不用再定義第三個就可以實現(xiàn)兩個裝飾類排列組合的效果。下面就簡單的做了一個通過對于手機接電話的一個擴展,接
3、聽電話之前有一個彩鈴,接受電話之后會回撥一段廣告,這樣就出來了下面的例子:[java]?viewplaincopy1.package?com.designpattern.decorator;??2.??3.public?interface?Phone?{??4.????public?void?recevieCall(String?name);??5.}??[java]?viewplaincopy1.package?com.designpattern.decorator;??2.??3.public?class?
4、ChinaMobile?implements?Phone?{??4.??5.????@Override??6.????public?void?recevieCall(String?name)?{??7.????????System.out.println("step?recevie?"?+?name?+?"?call");??8.????}??9.??10.}??[java]?viewplaincopy1.package?com.designpattern.decorator;??2.??1.public?ab
5、stract?class?Decorator?implements?Phone?{??2.??3.????private?Phone?phone;??4.??5.????public?Decorator(Phone?phone)?{??6.????????this.phone?=?phone;??7.????}??8.??9.????@Override??10.????public?void?recevieCall(String?name)?{??11.????????this.phone.recevieCal
6、l(name);??12.????}??13.??14.}??[java]?viewplaincopy1.package?com.designpattern.decorator;??2.??3.public?class?RingBeforeChinaMobileDecorator?extends?Decorator?{??4.??5.????public?RingBeforeChinaMobileDecorator(Phone?phone)?{??6.????????super(phone);??7.????}
7、??8.??9.????@Override??10.????public?void?recevieCall(String?name)?{??11.????????System.out.println("step?ring?before?recevie?"?+?name?+?"call");??12.????????super.recevieCall(name);??13.????}??14.??15.}??[java]?viewplaincopy1.package?com.designpattern.decor
8、ator;??2.??3.public?class?AdAfterChinaMobileDecorator?extends?Decorator?{??4.??5.????public?AdAfterChinaMobileDecorator(Phone?phone)?{??6.????????super(phone);??7.????}??1.??2.????@Override??3.?