概念
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的執行個體來示範裝飾器模式的用法。其中,我們将把一個形狀裝飾上不同的顔色,同時又不改變形狀類。
優點:裝飾類和被裝飾類可以獨立發展,不會互相耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動态擴充一個實作類的功能。 缺點:多層裝飾比較複雜。
示例
Shape.class.php(抽象接口)
<?php
namespace Decorator;
interface Shape
{
public function draw();
}
Circle.class.php(圓形具體實作類)
<?php
namespace Decorator;
class Circle implements Shape
{
public function draw()
{
print_r("Shape: Circle" );
}
}
Rectangle.class.php(長方形具體實作類)
<?php
namespace Decorator;
class Rectangle implements Shape
{
public function draw()
{
print_r("Shape: Rectangle");
}
}
ShapeDecorator.class.php(形狀裝飾類 抽象父類)
<?php
namespace Decorator;
abstract class ShapeDecorator implements Shape
{
protected $decoratorShape;
public function __construct(Shape $shape)
{
$this->decoratorShape = $shape;
}
public function draw()
{
$this->decoratorShape->draw();
}
}
<?php
namespace Decorator;
class RedShapeDecorator extends ShapeDecorator{
public function __construct(Shape $shape)
{
parent::__construct($shape);
}
public function draw()
{
$this->decoratorShape->draw();
$this->setRedColor($this->decoratorShape);
}
private function setRedColor(Shape $shape)
{
print_r("red");
}
}
<?php
spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
});
use Decorator\Circle;
use Decorator\RedShapeDecorator;
$circle = new Circle();
$redCircle = new RedShapeDecorator(new Circle());
$redCircle->draw();