装饰器模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器模式相关的知识,希望对你有一定的参考价值。


一、概念:

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

 

结构图:

装饰器模式_System

装饰器模式中的角色:

 

  ●  抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

  ●  具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。

  ●  装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

  ●  具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

 

 

 

 

示例代码:

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设计模式之装饰器模式

浅谈设计模式:装饰器模式|中介模式|原型模式