<?php class baseart{ public $content; protected $art = null; public function __construct($content){ $this->content = $content; } public function decorator(){ return $this->content; } } //编辑文章 class bianart extends baseart{ public function __construct(baseart $art){ $this->art = $art; } public function decorator(){ return $this->content = $this->art->decorator()."--小编摘要--"; } } //编辑文章 class seoart extends baseart{ public function __construct(baseart $art){ $this->art = $art; } public function decorator(){ return $this->content = "--seo--".$this->art->decorator(); } } $b = new seoart(new bianart(new baseart("天天向上"))); echo $b->decorator();
另外一个例子:
<?php /** * Class Component * Component抽象类, 可以给这些对象动态的添加职责 */ abstract class Component { abstract public function operation(); } /** * Component的实现类 * Class ConcreteComponent */ class ConcreteComponent extends Component { public function operation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } } /** * Class Decorator * 装饰器的抽象类,维持一个指向组件对象的接口对象, 并定义一个与组件接口一致的接口 */ abstract class Decorator extends Component { /** * 持有Component的对象 */ protected $component; /** * 构造方法传入 */ public function __construct(Component $component) { $this->component = $component; } abstract public function operation(); } /** * Class ConcreteDecoratorA * 装饰器的具体实现类,向组件对象添加职责,beforeOperation(),afterOperation()为前后添加的职责。 */ class ConcreteDecoratorA extends Decorator { //在调用父类的operation方法的前置操作 public function beforeOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } //在调用父类的operation方法的后置操作 public function afterOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } public function operation() { $this->beforeOperation(); $this->component->operation();//这里可以选择性的调用父类的方法,如果不调用则相当于完全改写了方法,实现了新的功能 $this->afterOperation(); } } class ConcreteDecoratorB extends Decorator { //在调用父类的operation方法的前置操作 public function beforeOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } //在调用父类的operation方法的后置操作 public function afterOperation() { echo __CLASS__ . '|' . __METHOD__ . "\r\n"; } public function operation() { $this->beforeOperation(); $this->component->operation();//这里可以选择性的调用父类的方法,如果不调用则相当于完全改写了方法,实现了新的功能 $this->afterOperation(); } } //客户端使用装饰器 $component = new ConcreteComponent(); $decoratorA = new ConcreteDecoratorA($component); $decoratorB = new ConcreteDecoratorB($decoratorA); $decoratorB->operation();
ConcreteDecoratorB|ConcreteDecoratorB::beforeOperation ConcreteDecoratorA|ConcreteDecoratorA::beforeOperation ConcreteComponent|ConcreteComponent::operation ConcreteDecoratorA|ConcreteDecoratorA::afterOperation ConcreteDecoratorB|ConcreteDecoratorB::afterOperation
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/8691474.html