飞雪连天射白鹿,笑书神侠倚碧鸳

0%

【23种设计模式】9装饰者模式

描述:对象易于动态添加新功能,开闭原则
优点:装饰类和被装饰类解耦,代替继承,动态展类的功能
缺点:过度使用,增加复杂度

应用:给类扩展功能,动态增加和删除功能,基础功能组合的新功能


classDiagram
  class Component {
    <>
    +operate()* viod
  }
  class ConcreteComponent{
    +operate() void
  }
  class Decorator{
    <>
    -component : Component
    constructor(component : Component )
    +operate() void
  }
  class ConcreteDecorator{
    constructor(component : Component)
    -methodA() void
    +operate() void
  }
  Component <|-- ConcreteComponent :继承
  Component <|-- Decorator :继承
  Component --o Decorator :聚合
  Decorator <|-- ConcreteDecorator :继承
  • 抽象类
    • 具体类继承抽象类
  • 装饰器抽象类
    • 实现具体装饰者
  • 实例化具体类
    • 对实例进行装饰,
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
// 抽象构件
abstract class Component {
public abstract operate() : void;
}
// 具体构件
class ConcreteComponent extends Component {
public operate() : void {
console.log('do something');
}
}
// 装饰角色
abstract class Decorator extends Component {
private component : Component = null;
constructor(component : Component ) {
super();
this.component = component;
}
public operate() : void {
this.component.operate();
}
}
// 具体装饰者
class ConcreteDecoratorA extends Decorator {
constructor(component : Component) {
super(component);
}
// 定义自己的修饰方法
private methodA() : void {
console.log('methodA修饰');
}
// 重写父类方法
public operate() : void {
this.methodA();
super.operate();
}
}
class ConcreteDecoratorB extends Decorator {
constructor(component : Component) {
super(component);
}
// 定义自己的修饰方法
private methodB() : void {
console.log('methodB修饰');
}
// 重写父类方法
public operate() : void {
this.methodB();
super.operate();
}
}
function main() {
let component : Component = new ConcreteComponent();
// 第一次装饰
component = new ConcreteDecoratorA(component);
// 第二次装饰
component = new ConcreteDecoratorB(component);
// 装饰后运行
component.operate();
}
听说,打赏我的人最后都找到了真爱
↘ 此处应有打赏 ↙
// 用户脚本