0%

设计模式之装饰者模式

故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。 ——《孟子·告子下》之《生于忧患,死于安乐》

一、概念

  1. 装饰者模式(Decorator Pattern),指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

    • 它是通过创建一个包装对象,也就是装饰来包裹真实的对象
  2. 优点

    • 该模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性
    • 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合
  3. 缺点

    • 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性
    • 装饰模式会导致设计中出现许多小类,如果过度使用会使程序变得很复杂
    • 装饰模式是针对抽象组件(Component)类型编程
  4. 适用场景

    • 扩展一个类的功能
    • 动态增加功能,动态撤销

二、demo

  1. 定义
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
interface Shape
{

}

class Rectangle implements Shape
{
public function draw()
{
echo "矩形", PHP_EOL;
}
}

class Circle implements Shape
{
public function draw()
{
echo "圆形", PHP_EOL;
}
}

abstract class ShapeDecorator implements Shape
{
protected $decoratedShape;

public function __construct($decoratedShape){
$this->decoratedShape = $decoratedShape;
}

public function draw()
{
$this->decoratedShape->draw();
}
}

class RedShapeDecorator extends ShapeDecorator {

public function __construct($decoratedShape)
{
parent::__construct($decoratedShape);
}

public function draw()
{
$this->decoratedShape->draw();
$this->setRedBorder($this->decoratedShape);
}

private function setRedBorder()
{
echo "Border Color: Red", PHP_EOL;
}
}

class DecoratorPatternDemo
{
public static function main() {

$circle = new Circle();
$rectangle = new Rectangle();

$redCircle = new RedShapeDecorator(new Circle());
$redRectangle = new RedShapeDecorator(new Rectangle());

$circle->draw();
echo PHP_EOL;

$rectangle->draw();
echo PHP_EOL;

$redCircle->draw();
echo PHP_EOL;

$redRectangle->draw();
}
}
  1. 调用
1
DecoratorPatternDemo::main();