# 装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能, 同时又不改变其结构。

装饰器模式属于结构型模式。

# UML 类图

# 传统的 Java 类图

decorator-pattern.png

# JavaScript 类图

js-decorator-pattern.png

# 作用

动态地给一个对象添加一些额外的职责。

# 优缺点

# 优点

  • 装饰器模式和继承的共同特点就是扩展对象的功能, 而装饰器模式比继承更加灵活。

  • 装饰类和被装饰类可以独立发展,不会相互耦合。

# 缺点

  • 多层装饰比较复杂。

# 场景

# 实现代码

/*
 * @Author: Rainy
 * @Date: 2019-11-14 19:25:01
 * @LastEditors  : Rainy
 * @LastEditTime : 2020-01-06 10:56:04
 */

class Decorator {
  circle: Circle;

  constructor(circle: Circle) {
    this.circle = circle;
  }

  draw(): void {
    this.circle.draw();
  }

  setRedBorder(circle: Circle): void {
    console.log('setRedBorder', this.circle);
  }
}

class ShapeDecorator {
  circleShape: CircleShape;

  constructor(circleShape: CircleShape) {
    this.circleShape = circleShape;
  }

  draw(): void {
    console.log('ShapeDecorator Draw');
    this.circleShape.draw();
  }
}

class RectShape implements Rectangle {
  draw(): void {
    console.log('Draw Circle');
  }
}

class CircleShape implements Circle {
  draw(): void {
    console.log('Draw Circle');
  }
}

class Circle {
  draw(): void {
    console.log('Draw Circle');
  }
}

class Rectangle {
  draw(): void {
    console.log('Draw Circle');
  }
}
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
56
57
58
59

# 参考

装饰器模式 (opens new window)