装饰器模式
通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。
显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。
装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。
这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
1 <?php 2 3 interface Shape 4 { 5 public function draw(); 6 } 7 8 9 10 class Circle implements Shape 11 { 12 public function draw() 13 { 14 echo "<br/>我是圆形"; 15 } 16 } 17 18 class Rectangle implements Shape 19 { 20 public function draw() 21 { 22 echo "<br/>我是长方形"; 23 } 24 } 25 26 27 28 class RedBorderDecorator implements Shape 29 { 30 private $_shape; 31 32 public function __construct(\Shape $shape) 33 { 34 $this->_shape = $shape; 35 } 36 37 public function draw() 38 { 39 $this->setBorder(); 40 $this->_shape->draw(); 41 } 42 43 44 45 private function setBorder() 46 { 47 echo "<br/>我是红色边框设置"; 48 } 49 } 50 51 52 $c = new Circle(); 53 $c->draw(); 54 55 $red = new RedBorderDecorator($c); 56 $red->draw();