PHP设计模式之装饰者模式代码实例

yipeiwu_com5年前PHP代码库

定义:

装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。

角色:

Component(被装饰对象基类)
ConcreteComponent(具体被装饰对象)
Decorator(装饰者基类)
ContreteDecorator(具体的装饰者类)

示例代码:

//被装饰者基类
interface Component
{
  public function operation();
}
 
//装饰者基类
abstract class Decorator implements Component
{
  protected $component;
 
  public function __construct(Component $component)
  {
    $this->component = $component;
  }
 
  public function operation()
  {
    $this->component->operation();
  }
}
 
//具体装饰者类
class ConcreteComponent implements Component
{
  public function operation()
  {
    echo 'do operation'.PHP_EOL;
  }
}
 
//具体装饰类A
class ConcreteDecoratorA extends Decorator {
  public function __construct(Component $component) {
    parent::__construct($component);
 
  }
 
  public function operation() {
    parent::operation();
    $this->addedOperationA();  // 新增加的操作
  }
 
  public function addedOperationA() {
    echo 'Add Operation A '.PHP_EOL;
  }
}
 
//具体装饰类B
class ConcreteDecoratorB extends Decorator {
  public function __construct(Component $component) {
    parent::__construct($component);
 
  }
 
  public function operation() {
    parent::operation();
    $this->addedOperationB();
  }
 
  public function addedOperationB() {
    echo 'Add Operation B '.PHP_EOL;
  }
}
 
 
class Client {
 
  public static function main() {
    /*
    do operation
    Add Operation A
    */
    $decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
    $decoratorA->operation();
 
 
    /*
    do operation
    Add Operation A 
    Add Operation B 
    */
    $decoratorB = new ConcreteDecoratorB($decoratorA);
    $decoratorB->operation();
  }
 
}
 
Client::main();

相关文章

PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法

本文实例讲述了PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法。分享给大家供大家参考,具体如下: 这里把ffmpeg 和  生成缩略图整合了一下: include...

PHP自定义图片缩放函数实现等比例不失真缩放的方法

本文实例讲述了PHP自定义图片缩放函数实现等比例不失真缩放的方法。分享给大家供大家参考,具体如下: function resizeImage($im,$maxwidth,$maxhe...

PHP调用Linux的命令行执行文件压缩命令

前几天工作中,需要将3个txt文件,打包成*.zip down到本地…… 一开始,我和普通青年一样,想到用PHP内置的 ZipArchive,代码看起来应该是这样的: 复制代码 代码如下...

PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法

PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法

本文实例讲述了PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法。分享给大家供大家参考,具体如下: 先来看看前序遍历、中序遍历与后序遍历原理图: 根据树的前序遍历和中序遍历构造...

php数组函数序列之array_combine() - 数组合并函数使用说明

array_combine() 定义和用法 array_combine() 函数通过合并两个数组来创建一个新数组,其中的一个数组是键名,另一个数组的值为键值。 如果其中一个数组为空,或者...