您的位置:首页 > 其它

装饰器模式

2016-07-21 08:56 309 查看
一、概念:

       装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。

结构图:



装饰器模式中的角色:

  ●  抽象构件(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 }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: