装饰器模式
来源:互联网 发布:超氧换血疗法 知乎 编辑:程序博客网 时间:2024/06/04 19:33
意图:动态的将责任附加到对象上
什么时候使用:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时
结构图:
示例代码:
- 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
-
-
- 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
-
-
- 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);
- 7 employee = new ManagerB(employee);
- 8
- 9 employee.doCoding();
- 10 }
- 11 }
项目经理A做需求分析
项目经理A做架构设计
项目经理A做详细设计
程序员加班写程序啊,写程序,终于写完了。。。
项目经理B 在做收尾工作
实际应用中的例子:Java i/o
应用到的设计原则:对扩展开放,对修改关闭
优缺点:
1.装饰者类反应出被装饰的组件类型
2.装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的
3.可以用无数个装饰者包装一个组件,装饰者类会导致设计中出现许多小对象,过度使用会让程序变的复杂
4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
0 0