java装饰器模式

意图:动态的将责任附加到对象上
什么时候使用:
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     /**
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 }
项目经理A做需求分析
项目经理A做架构设计
项目经理A做详细设计
程序员加班写程序啊,写程序,终于写完了。。。
项目经理B 在做收尾工作

 实际应用中的例子:java i/o

应用到的设计原则:对扩展开放,对修改关闭

优缺点:

1.装饰者类反应出被装饰的组件类型

2.装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的

3.可以用无数个装饰者包装一个组件,装饰者类会导致设计中出现许多小对象,过度使用会让程序变的复杂

4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

原文地址:https://www.cnblogs.com/ikuman/p/2877913.html