標籤:style blog http java color 使用
動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比產生子類更為靈活。動態地將責任附加到對象上。若要擴充功能,裝飾者提供了比繼承更有彈性的替代方案。
具體被裝飾者和抽象裝飾類都繼承於抽象被裝飾者類,繼承的是類型,而不是行為。行為來自裝飾者和基礎組件,或與其他裝飾者之間的組合關係。
裝飾者通常是用其他類似於工廠或產生器這樣的模式建立的。
代碼說明一切
package com.yydcdut.decorate;//被裝飾者抽象類別public interface Phone { public void call();}
package com.yydcdut.decorate;//被裝飾者具體類public class RealPhone implements Phone { @Override public void call() { System.out.println("打電話。。。"); }}
package com.yydcdut.decorate;//裝飾者抽象類別public abstract class PhoneDecorate implements Phone { private Phone phone = null; public PhoneDecorate(Phone phone) { this.phone = phone; } @Override public void call() { this.phone.call(); }}
package com.yydcdut.decorate;//裝飾者的具體類public class AfterPhone extends PhoneDecorate { Phone phone = null; public AfterPhone(Phone phone) { super(phone); this.phone = phone; } @Override public void call() { super.call(); System.out.println("打完電話。。。。"); }}
package com.yydcdut.decorate;//裝飾者的具體類public class BeforePhone extends PhoneDecorate { Phone phone = null; public BeforePhone(Phone phone) { super(phone); this.phone = phone; } @Override public void call() { System.out.println("打電話之前。。。。。"); super.call(); }}
package com.yydcdut.decorate;//測試類別,主函數public class PhoneMain { public static void main(String[] args) { Phone phone = new RealPhone(); phone.call(); System.out.println("-----------------------"); PhoneDecorate pd = new BeforePhone(phone); pd.call(); System.out.println("-----------------------"); pd = new AfterPhone(phone); pd.call(); System.out.println("-----------------------"); pd = new AfterPhone(new BeforePhone(phone)); pd.call();
}}
總結
1)繼承屬於擴充形式之一,但不見得是達到彈性設計的最佳方式。
2)在設計中,應該允許行為可以被擴充,而無須修改現有的代碼。
3)組合和委託可用於在運行時動態地加上新的行為。
4)除了繼承,裝飾者模式也可以讓我們擴充行為。
5)裝飾者模式意味著一群裝飾者類,這些類用來封裝具體組件。
6)裝飾者類反映出被裝飾的組件類型(事實上,他們具有相同的類型,都經過介面或繼承實現)。
7)裝飾者可以在被裝飾者的行為前面與/或後面加上自己的行為,甚至將被裝飾者的行為整個取代掉,而達到特定的目的。
8)可以用無數個裝飾者封裝一個組件。
9)裝飾者一般對組件的客戶是透明的,除非客戶程式依賴於組件的具體類型。
10)裝飾者會導致設計中出現許多小對象,如果過度使用,會讓程式變得很複雜。
Java的IO流也是用了裝飾模式,BufferedInputStream/BufferedOutputStream/BufferedReader/BufferesWriter,比如:
BufferedWriter bw = new BufferedWriter(new FileWriter(“abc.txt”));
我是天王蓋地虎的分割線
原始碼:http://pan.baidu.com/s/1dD1Qx01
java模版.zip
轉載請註明出處:http://www.cnblogs.com/yydcdut