码迷,mamicode.com
首页 > 编程语言 > 详细

Java常用的设计模式07:常用设计模式之装饰器模式

时间:2015-10-13 10:40:05      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:

 1. Java之装饰器模式(Decorator Pattern)

(1)概述:

    装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。在不必改变原类文件和使用继承的情况下,动态    地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象

    装饰者模式:动态地给一个对象添加一些额外的职责,就像在墙上刷油漆一样。就增加功能来说,Decorator模式比生成子类更为灵活。

  Decorator模式的工作原理是:可以创建始于Decorator对象(负责新的功能的对象)终于原对象的一个对象"链"

                       技术分享

                        图1  装饰者链

装饰模式的特点

  • 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
  • 装饰对象包含一个真实对象的引用(reference)
  • 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
  • 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

 

(2)装饰器模式的UML图:

原理图:
技术分享
 
其中类的职责如下:
  抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
  具体构件角色(Employe):定义一个将要接收附加责任的类
  装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
  具体装饰角色(ManagerA、ManagerB):负责给构件对象" 贴上"附加的责任
 
 
2. 装饰者模式代码实现:
 
下面通过一个软件项目例子来说明装饰模式的使用:
过程是这样的:
项目经理接到一个项目,项目最终要完成编码。
项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。
 
 
实现代码如下:
 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 在做收尾工作 

Java常用的设计模式07:常用设计模式之装饰器模式

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/4873667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!