在java中,裝飾器模式使用場景非常普遍,例如BufferedInputStream就利用了裝飾器模式。
裝飾器模式與代理模式非常相似,相似點可總結如下:
1、都是對原始類功能、特性的增強。 2、都是通過注入原始類來實現(xiàn)類的增強。 3、其增強原始類的方式都是非侵入的,可插拔的。 4、被擴展后的代碼具有良好的擴展性。
當然,不同點如下:
1、注入方式不同。裝飾器模式是通過其構造方法接受原始類的實例的引用注入;代理模式是通過內部自動創(chuàng)建原始類的實例。 2、擴展性不同。裝飾器模式可以利用多態(tài)性來實現(xiàn)增強指定類的功能;代理模式只能針對固定類。裝飾器模式的擴展性更強。
裝飾設計模式示意圖:

代碼:
/** * @author Hanlin Wang */public class DecoratorMode { public static void main(String[] args) { A a = new A(); Decorator decorator = new Decorator(a); decorator.run(); }}//定義裝飾類class Decorator implements C1{ PRivate C1 c; public Decorator(C1 c){ this.c = c; } public void run(){ System.out.println("before"); c.run(); System.out.println("after"); }}//定義被裝飾類裝飾的類class A implements C1{ public void run(){ System.out.println("A's running"); }}//定義A類實現(xiàn)的接口interface C1{ void run();}Decorator為裝飾器類,A為原始類,C1為公共接口,接口中有一個run方法。Decorator、A都實現(xiàn)C1接口的run方法。Decorator類中定義了私有的A類的成員變量a,并自定義了構造函數(shù)public Decorator(A a)用于注入a成員變量引用的實例對象。
新聞熱點
疑難解答