/** * 裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類的一個包裝。 * 這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。 * 我們通過下面的實例來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。 * 優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。 * 缺點:多層裝飾比較復雜。 */
(1)Shape.class.php(抽象接口)
<?php namespace Decorator; interface Shape { public function draw(); }
(2)Circle.class.php(圓形具體實現類)
<?php namespace Decorator; class Circle implements Shape { public function draw() { print_r("Shape: Circle" ); } }
(3)Rectangle.class.php(長方形具體實現類)
<?php namespace Decorator; class Rectangle implements Shape { public function draw() { print_r("Shape: Rectangle"); } }
(4)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(); } }
(5)RedShapeDecorator.class.php
<?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"); } }
(6)decorator.php(客戶端類)
<?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();