Java装饰器模式
2017-02-15 21:22 深蓝大道 阅读(269) 评论(0) 编辑 收藏 举报意图:动态的将责任附加到对象上
什么时候使用:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时
结构图:
package com.test.patten.decorator; public interface Person { void doCoding(); }
package com.test.patten.decorator; public class Employee implements Person { @Override public void doCoding() { System.out.println("程序员加班写程序啊,写程序,终于写完了。。。"); } }
package com.test.patten.decorator; public abstract class Manager implements Person{ //装饰器增加功能 public abstract void doCoding(); }
package com.test.patten.decorator; public class ManagerA extends Manager { private Person person;//给雇员升职 public ManagerA(Person person) { super(); this.person = person; } @Override public void doCoding() { doEarlyWork(); person.doCoding(); } /** * 项目经理开始前期准备工作 */ public void doEarlyWork() { System.out.println("项目经理A做需求分析"); System.out.println("项目经理A做架构设计"); System.out.println("项目经理A做详细设计"); } }
package com.test.patten.decorator; public class ManagerB extends Manager { private Person person;//给雇员升职 public ManagerB(Person person) { super(); this.person = person; } @Override public void doCoding() { person.doCoding(); doEndWork(); } /** * 项目经理开始项目收尾工作 */ public void doEndWork() { System.out.println("项目经理B 在做收尾工作"); } }
package com.test.patten.decorator; public class Client { public static void main(String args[]){ Person employee = new Employee(); employee = new ManagerA(employee);//赋予程序猿项目经理A职责 employee = new ManagerB(employee);//赋予程序猿项目经理B职责 employee.doCoding(); } }
项目经理A做需求分析
项目经理A做架构设计
项目经理A做详细设计
程序员加班写程序啊,写程序,终于写完了。。。
项目经理B 在做收尾工作
应用到的设计原则:对扩展开放,对修改关闭
优缺点:
1.装饰者类反应出被装饰的组件类型
2.装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的
3.可以用无数个装饰者包装一个组件,装饰者类会导致设计中出现许多小对象,过度使用会让程序变的复杂
4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
转自:http://www.cnblogs.com/ikuman/archive/2013/01/29/2877913.htm