您的位置:首页 > 编程语言 > Java开发

java装饰器模式

2016-05-30 14:42 531 查看



意图:动态的将责任附加到对象上

什么时候使用:

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 }


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



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

优缺点:

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

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

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

4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java装饰器模式