代码改变世界

Java装饰器模式

2017-02-15 21:22  深蓝大道  阅读(270)  评论(0编辑  收藏  举报

意图:动态的将责任附加到对象上
什么时候使用:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时
结构图:

 

package com.test.patten.decorator;

public interface Person {
     void doCoding();
}
package com.test.patten.decorator;

public class Employee implements Person {

    @Override
    public void doCoding() {
        System.out.println("程序员加班写程序啊,写程序,终于写完了。。。");
    }

}
package com.test.patten.decorator;

public abstract class Manager implements Person{
    
    //装饰器增加功能
    public abstract void doCoding();

}
package com.test.patten.decorator;

public class ManagerA extends Manager {
    private Person person;//给雇员升职
    
    public ManagerA(Person person) {
        super();
        this.person = person;
    }
    @Override
    public void doCoding() {
        doEarlyWork();
        person.doCoding();        
    }
    /**
     * 项目经理开始前期准备工作
     */
    public void doEarlyWork() {
        System.out.println("项目经理A做需求分析");
        System.out.println("项目经理A做架构设计");
        System.out.println("项目经理A做详细设计"); 
    }
}
package com.test.patten.decorator;

public class ManagerB extends Manager {
    private Person person;//给雇员升职
    
    public ManagerB(Person person) {
        super();
        this.person = person;
    }
    @Override
    public void doCoding() {
        person.doCoding();
        doEndWork();
    }
    /**
     * 项目经理开始项目收尾工作
     */
    public void doEndWork() {
        System.out.println("项目经理B 在做收尾工作");
    }
    
}
package com.test.patten.decorator;

public class Client {
    public static void main(String args[]){
        Person employee = new Employee();
        employee = new ManagerA(employee);//赋予程序猿项目经理A职责
        employee = new ManagerB(employee);//赋予程序猿项目经理B职责
        
        employee.doCoding();
    }
}

项目经理A做需求分析

项目经理A做架构设计
项目经理A做详细设计
程序员加班写程序啊,写程序,终于写完了。。。
项目经理B 在做收尾工作
 

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

优缺点:

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

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

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

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

 

 

转自:http://www.cnblogs.com/ikuman/archive/2013/01/29/2877913.htm