装饰器模式
2016-07-21 08:56
309 查看
一、概念:
装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。
结构图:
装饰器模式中的角色:
● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
● 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
● 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
● 具体装饰([b]ConcreteDecorator)角色:[/b]负责给构件对象“贴上”附加的责任。
示例代码:
测试:
装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。
结构图:
装饰器模式中的角色:
● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
● 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
● 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
● 具体装饰([b]ConcreteDecorator)角色:[/b]负责给构件对象“贴上”附加的责任。
示例代码:
1 package com.test.patten.decorator; 2 3 public interface Person { 4 void doCoding(); 5 }
1 package com.test.patten.decorator; 2 3 public class Employee implements Person { 4 5 @Override 6 public void doCoding() { 7 System.out.println("程序员敲代码。。。。"); 8 } 9 10 }
1 package com.test.patten.decorator; 2 3 public abstract class Manager implements Person{ 4 5 //装饰器增加功能 6 public abstract void doCoding(); 7 8 }
1 package com.test.patten.decorator; 2 3 public class ManagerA extends Manager { 4 private Person person;//给雇员升职 5 6 public ManagerA(Person person) { 7 super(); 8 this.person = person; 9 } 10 @Override 11 public void doCoding() { 12 doEarlyWork(); 13 person.doCoding(); 14 } 15 /** 16 * 项目经理开始前期准备工作 17 */ 18 public void doEarlyWork() { 19 System.out.println("项目经理A做需求分析"); 20 System.out.println("项目经理A做架构设计"); 21 System.out.println("项目经理A做详细设计"); 22 } 23 }
1 package com.test.patten.decorator; 2 3 public class ManagerB extends Manager { 4 private Person person;//给雇员升职 5 6 public ManagerB(Person person) { 7 super(); 8 this.person = person; 9 } 10 @Override 11 public void doCoding() { 12 person.doCoding(); 13 doEndWork(); 14 } 15 /** 16 * 项目经理开始项目收尾工作 17 */ 18 public void doEndWork() { 19 System.out.println("项目经理B 在做收尾工作"); 20 } 21 22 }
测试:
1 package com.test.patten.decorator; 2 3 public class Client { 4 public static void main(String args[]){ 5 Person employee = new Employee(); 6 employee = new ManagerA(employee);//赋予程序猿项目经理A职责 7 employee = new ManagerB(employee);//赋予程序猿项目经理B职责 8 9 employee.doCoding(); 10 } 11 }
相关文章推荐
- 杭电oj-1200
- SIGCHLD信号
- 教你快速拿到iOS应用中所有图片资源
- abort函数
- [Cloud Computing]Mechanisms: Remote Administration System
- 缓冲区对象BufferedWriter
- Exit()
- 对stdin,stdout 和STDOUT_FILENO,STDIN_FILENO的学习
- easyui-datagrid 编辑模式详解
- Linux中fork()函数详解
- 知道这20个正则表达式,能让你少写1,000行代码
- getppid()
- Activity状态 一般认为Activity有以下四种状态:
- 老男孩-day1作业一
- Android中获取当前的Activity
- C语言字符串指针与字符数组的区别
- NYOJ-16-矩形嵌套(动态规划)
- 关于Hibernate和mybatis的简单对比
- VC++6.0常用快捷键及对快捷键使用的看法(转)
- 杭电 ACM 几道有关string的题目