标签:
1. Java之装饰器模式(Decorator Pattern)
(1)概述:
装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。在不必改变原类文件和使用继承的情况下,动态 地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰者模式:动态地给一个对象添加一些额外的职责,就像在墙上刷油漆一样。就增加功能来说,Decorator模式比生成子类更为灵活。
Decorator模式的工作原理是:可以创建始于Decorator对象(负责新的功能的对象)终于原对象的一个对象"链"
图1 装饰者链
装饰模式的特点:
(2)装饰器模式的UML图:
1 /** 2 * 项目 3 */ 4 public interface Project { 5 6 /** 7 * 写代码 8 */ 9 void doCoding(); 10 }
1 /** 2 * 代码工人 3 */ 4 public class Employe implements Project{ 5 /** 6 * 编码 7 */ 8 public void doCoding(){ 9 System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!"); 10 } 11 }
1 /** 2 * 项目经理 3 */ 4 public class Manager implements Project { 5 private Project project; //实际上存放的是代码工人对象 6 7 public Manager(Project project) { 8 this.project = project; 9 } 10 11 /** 12 * 编码 13 */ 14 public void doCoding() { 15 //项目经理开始新的工作 16 startNewWork(); 17 } 18 19 /** 20 * 模板:定义项目经理自己的事情 21 */ 22 public void startNewWork() { 23 //项目经理在做早期工作 24 doEarlyWork(); 25 //项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干 26 project.doCoding(); 27 //项目经理在做收尾工作 28 doEndWork(); 29 } 30 31 /** 32 * 项目经理自己的事情:做早期工作 33 */ 34 public void doEarlyWork() { 35 } 36 37 /** 38 * 项目经理做收尾工作 39 */ 40 public void doEndWork() { 41 } 42 }
1 /** 2 * 具体的项目经理A 3 */ 4 public class ManagerA extends Manager{ 5 6 public ManagerA(Project project) { 7 super(project); 8 } 9 10 /** 11 * 项目经理自己的事情:做早期工作 12 */ 13 public void doEarlyWork() { 14 System.out.println("项目经理A 在做需求分析"); 15 System.out.println("项目经理A 在做架构设计"); 16 System.out.println("项目经理A 在做详细设计"); 17 } 18 } 19
1 /** 2 * 具体的项目经理B 3 */ 4 public class ManagerB extends Manager { 5 6 public ManagerB(Project project) { 7 super(project); 8 } 9 10 /** 11 * 项目经理自己的事情:做早期工作 12 */ 13 public void doEarlyWork() { 14 System.out.println("项目经理B 在做需求分析"); 15 System.out.println("项目经理B 在做详细设计"); 16 } 17 18 /** 19 * 项目经理做收尾工作 20 */ 21 public void doEndWork() { 22 System.out.println("项目经理B 在做收尾工作"); 23 } 24 }
1 /** 2 * 客户端测试 3 */ 4 public class Client { 5 public static void main(String args[]) { 6 Project employe = new Employe(); //代码工人 7 Project managerA = new ManagerA(employe); //项目经理 8 Project managerB = new ManagerB(employe); //项目经理 9 //以经理的名义将编码完成,功劳都是经理的,实际编码的是工人 10 managerA.doCoding(); 11 managerB.doCoding(); 12 } 13 }
运行结果:
项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做需求分析
项目经理B 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做收尾工作
标签:
原文地址:http://www.cnblogs.com/hebao0514/p/4873667.html