第0章:簡介
裝飾模式定義:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式比生成子類更爲靈活
裝飾模式本質:動態組合
參考:http://chjavach.iteye.com/blog/767739 ,研磨設計模式(書籍),大話設計模式(書籍)
模式圖:
待補充
第1章:實踐
(1)組件對象的接口(Component.java)
package com.mcc.core.designPattern.structure.decorator; /** * 組件對象的接口,可以給這些對象動態地添加職責 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-13 下午11:44 */ public abstract class Component { public abstract void someMethod(); } |
(2)組件對象接口的具體實現對象A(ComponentExtendsA)
package com.mcc.core.designPattern.structure.decorator; /** * 組件對象接口的具體實現對象A,被裝飾的對象 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-13 下午11:50 */ public class ComponentExtendsA extends Component { @Override public void someMethod() { System.out.println("組件對象具體實現對象A的方法"); } } |
(3)組件對象接口的具體實現對象B(ComponentExtendsB.java)
package com.mcc.core.designPattern.structure.decorator; /** * 組件對象接口的具體實現對象B,被裝飾的對象 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-13 下午11:54 */ public class ComponentExtendsB extends Component { @Override public void someMethod() { System.out.println("組件對象具體實現對象B的方法"); } } |
(4)裝飾器的接口(Decorator.java)
package com.mcc.core.designPattern.structure.decorator; /** * 裝飾器的接口,維持一個指向組件對象的接口對象,自身也是組件對象的子類 * * 裝飾模式的定義:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式比生成子類更爲靈活 * 裝飾模式的本質:動態組合 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-13 下午11:55 */ public abstract class Decorator extends Component { //持有組件對象 protected Component component; /** * 構造器,傳入組件對象,對象來自裝飾器具體實現對象 * @param component */ public Decorator(Component component){ this.component = component; } @Override public void someMethod(){ System.out.println("轉發前可以附加操作"); //轉發請求給組件對象 component.someMethod(); System.out.println("轉發後可以附加操作"); } } |
(5)裝飾器具體實現類A(DecoratorExtendsA.java)
package com.mcc.core.designPattern.structure.decorator; /** * 裝飾器具體實現類A * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-14 上午12:05 */ public class DecoratorExtendsA extends Decorator { /** * 構造器,傳入組件對象,對象來自裝飾器具體實現對象 * * @param component */ public DecoratorExtendsA(Component component) { super(component); } @Override public void someMethod() { System.out.println("裝飾器A調用父類方法前操作"); //調用方法,這裏可以向組件對象添加職責 super.someMethod(); System.out.println("裝飾器A調用父類方法後操作"); } } |
(6)裝飾器具體實現類B(DecoratorExtendsB.java)
package com.mcc.core.designPattern.structure.decorator; /** * 裝飾器具體實現類B * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-14 上午12:10 */ public class DecoratorExtendsB extends Decorator { /** * 構造器,傳入組件對象,對象來自裝飾器具體實現對象 * * @param component */ public DecoratorExtendsB(Component component) { super(component); } @Override public void someMethod() { System.out.println("裝飾器B調用父類方法前操作"); //調用方法,這裏可以向組件對象添加職責 super.someMethod(); System.out.println("裝飾器B調用父類方法後操作"); } } |
(7)客戶端測試(Client.java)
package com.mcc.core.designPattern.structure.decorator; /** * 客戶端測試 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-14 上午12:15 */ public class Client { public static void main(String args[]){ //被裝飾的對象 Component componentA = new ComponentExtendsA(); Component componentB = new ComponentExtendsB(); System.out.println("\n裝飾器A裝飾被裝飾對象A:\n"); Decorator decoratorAA = new DecoratorExtendsA(componentA); decoratorAA.someMethod(); System.out.println("\n裝飾器A裝飾被裝飾對象B:\n"); Decorator decoratorAB = new DecoratorExtendsA(componentB); decoratorAB.someMethod(); System.out.println("\n裝飾器B裝飾被裝飾對象A:\n"); Decorator decoratorBA = new DecoratorExtendsB(componentA); decoratorBA.someMethod(); System.out.println("\n裝飾器B裝飾被裝飾對象B:\n"); Decorator decoratorBB = new DecoratorExtendsB(componentB); decoratorBB.someMethod(); } } |