定义:
装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。
角色:
Component(被装饰对象基类)
ConcreteComponent(具体被装饰对象)
Decorator(装饰者基类)
ContreteDecorator(具体的装饰者类)
示例代码:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
//被装饰者基类 interface Component { public function operation(); } //装饰者基类 abstract class Decorator implements Component { protected $component ; public function __construct(Component $component ) { $this ->component = $component ; } public function operation() { $this ->component->operation(); } } //具体装饰者类 class ConcreteComponent implements Component { public function operation() { echo 'do operation' .PHP_EOL; } } //具体装饰类A class ConcreteDecoratorA extends Decorator { public function __construct(Component $component ) { parent::__construct( $component ); } public function operation() { parent::operation(); $this ->addedOperationA(); // 新增加的操作 } public function addedOperationA() { echo 'Add Operation A ' .PHP_EOL; } } //具体装饰类B class ConcreteDecoratorB extends Decorator { public function __construct(Component $component ) { parent::__construct( $component ); } public function operation() { parent::operation(); $this ->addedOperationB(); } public function addedOperationB() { echo 'Add Operation B ' .PHP_EOL; } } class Client { public static function main() { /* do operation Add Operation A */ $decoratorA = new ConcreteDecoratorA( new ConcreteComponent()); $decoratorA ->operation(); /* do operation Add Operation A Add Operation B */ $decoratorB = new ConcreteDecoratorB( $decoratorA ); $decoratorB ->operation(); } } Client::main(); |