设计模式——结构型模式(四)

Decorator 模式

目标

动态地给一个对象添加一些额外的职责,比子类的生成更佳灵活。

结构

结构图

Decorator类中保留着一个Component类的一个指针。

协作

时序图

Decorator的Operation方法被调用先调用Component中的Operation,然后再调用Decorator类中的Operation方法进行装饰绘制。

适用情形

  1. 不在影响其他对象的情况下,以动态、透明的方式给单个对象添加、撤销职责;

  2. 当有着大量且可以互相组合的扩展功能的时候的时候,适用子类将会使子类数量极大的时候;

  3. 当某个类是不可被继承的时候,想要扩展其功能也可以使用装饰器模式。

参与者

  • Component

    一个需要动态添加职责的对象接口。

  • ConcreteComponent

    具体具有相应职责的一个对象。

  • Decorator

    保留一个指向Component对象的指针,具有与Component完全一样的接口方法。

  • ConcreteDecorator

    具有着具体的实现方法的装饰器,会给予Component各种不同的职责。

效果

  1. 比继承更加灵活。

    使用户可以自由组合各种职责,增加职责添加删除的自由度,同时可以很方便地重复添加一个特性。

  2. 不需要让抽象类在一开始就支持过多的方法与特征。

  3. 会出现许多的小对象,使得用户在使用的时候比较容易,但是在学习使用的时候花费大量的时间。

  4. Decorator就像是一个外壳,将会把原有的Component类包裹住,所以在这样的情况下就有要求Component应该足够的简单,以便于Decorator能够拥有Component类的所有接口方法。如果Component类原本就非常大,就应该使用Strategy模式而不是装饰器模式。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
abstract class Garden{
abstract public void beVisited();
}
class BigGarden extends Garden{
@Override
public void beVisited() {
System.out.println("What a lovely place!");
}
}
class Flower extends Garden{
private Garden obj;
private Flower() {
super();
}
public Flower(Garden garden) {
super();
this.obj = garden;
}
@Override
public void beVisited() {
obj.beVisited();
System.out.println("How fragrant!");
}
}
class Bird extends Garden{
private Garden obj;
private Bird() {
super();
}
public Bird(Garden garden) {
super();
this.obj = garden;
}
@Override
public void beVisited() {
obj.beVisited();
System.out.println("How wonderful!");
}
}
public class Visitor{
public static void main(String args[]) {
Garden garden = new Bird(new Flower(new BigGarden()));
garden.beVisited();
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.