装饰者模式

装饰者模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰者模式的特点:

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

装饰者模式的适用范围:

1. 需要扩展一个类的功能,或给一个类添加附加职责。
2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
 
装饰者模式实现步骤:
1、在装饰者类中维护一个被装饰者的对象。
2、装饰者类都继承相同的类或实现相同的接口(一般为被装饰者对象)。
  注意:拥有共同的父类,这些装饰类就可以构成一个装饰链从而达到相互装饰的效果。
 
代码示例:
 1 interface Work{
 2     
 3     public void work();
 4 }
 5 
 6 class Son implements Work{
 7     @Override
 8     public void work() {
 9         System.out.println("画画...");
10     }
11 }
12 
13 class Mather implements Work{
14 
15     //需要被增强的类。
16     Work worker;
17     
18     public Mather(Work worker){
19         this.worker = worker;
20     }
21     
22     @Override
23     public void work() {
24         worker.work();
25         System.out.println("给画上颜色..");
26     }
27 }
28 
29 
30 class Father implements Work{
31 
32     //需要被增强的类的引用
33     Work worker;
34     public Father(Work worker){
35         this.worker = worker;
36     }
37     
38     @Override
39     public void work() {
40         worker.work();
41         System.out.println("上画框...");
42     }
43 }
44 
45 
46 public class Demo3 {
47     
48     public static void main(String[] args) {
49         Son s = new Son();
50 //        s.work();
51         Mather m = new Mather(s);
52 //        m.work();
53         Father f = new Father(m);
54         f.work();
55     }
56 }
View Code

装饰者模式和继承都可以扩展原有类的功能。那么两者有什么优缺点呢:

继承实现的增强类:

       优点:代码结构清晰,而且实现简单

       缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。

修饰模式实现的增强类:

       优点:内部可以通过多态技术对多个需要增强的类进行增强

       缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。

原文地址:https://www.cnblogs.com/nicker/p/6250313.html