第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(); } } |