裝飾模式:類似代理
定義:動態給一個對象添加一些額外的職責,就象在牆上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更爲靈活。
設計初衷:通常可以使用繼承來實現功能的拓展,如果這些需要拓展的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性,同時,使用繼承實現功能拓展,我們必須可預見這些拓展功能,這些功能是編譯時就確定了,是靜態的。
定義超類:
public interface Source { void say(); void sing(); } 具體實現(被裝飾者): public class SourceImpl implements Source { public void say() { System.out.println("hello"); } public void sing() { System.out.println("sing a song"); } } 抽象裝飾:裝飾者與被裝飾者擁有共同的超類,繼承的目的是繼承類型,而不是行爲 public abstract class Decorator implements Source{ private Source source; public Decorator(Source source) { this.source = source; } public void say() { this.source.say(); } public void sing() { this.source.sing(); } } 裝飾者1 public class D1 extends Decorator { public D1(Source source) { super(source); } @Override public void say() { super.say(); System.out.println("chen"); } @Override public void sing() { super.sing(); System.out.println("吻別"); } } 裝飾者2 public class D2 extends Decorator { public D2(Source source) { super(source); } @Override public void say() { log("start say:"); super.say(); } @Override public void sing() { log("start sing:"); super.sing(); } public void log(String log){ System.out.println(log); } } 測試: public class Client { public static void main(String[] args) { Source source = new SourceImpl(); Decorator decorator = new D2(new D1(source)); decorator.say(); decorator.sing(); } } 結果: start say: hello chen start sing: sing a song 吻別