PHP设计模式之装饰器(装饰者)模式(Decorator)(2)

  • 通过addUser来添加用户名
  • getUserList方法将打印出用户名信息
  • 现在需要将添加的用户信息变成大写的,我们需要不改变原先的类,并且不改变原先的数据结构
  • 我们设计了一个UserInfoDecorate类来完成这个需求的操作,就像装饰一样,给原先的数据进行了装修
  • 装饰器模式有些像适配器模式,但是一定要注意,装饰器主要是不改变现有对象数据结构的前提
  • 代码如下:

    UserInfo.php

    //装饰器模式,对已有对象的部分内容或者功能进行调整,但是不需要修改原始对象结构,可以使用装饰器设计模式
    class UserInfo {
     public $userInfo = array(); 
     
     public function addUser($userInfo) {
     $this->userInfo[] = $userInfo;
     }
     
     public function getUserList() {
     print_r($this->userInfo);
     }
    }
    //UserInfoDecorate 装饰一样,改变用户信息输出为大写格式,不改变原先UserInfo类
    <?php
    include("UserInfo.php");
    class UserInfoDecorate {
     
     public function makeCaps($UserInfo) {
     foreach ($UserInfo->userInfo as &$val) {
      $val = strtoupper($val);
     }
     }
     
    }
    $UserInfo = new UserInfo;
    $UserInfo->addUser('zhu');
    $UserInfo->addUser('initphp');
    $UserInfoDecorate = new UserInfoDecorate;
    $UserInfoDecorate->makeCaps($UserInfo);
    $UserInfo->getUserList();
    
    

    到此,咱们应该是对于装饰器模式有了一个大概的了解,接下来咱们看一下构建装饰器模式的案例,网上的,先来看目录结构:

    |decorator  #项目根目录
    |--Think  #核心类库
    |----Loder.php  #自动加载类
    |----decorator.php  #装饰器接口
    |----colorDecorator.php  #颜色装饰器
    |----sizeDecorator.php  #字体大小装饰器
    |----echoText.php  #被装饰者
    |--index.php #单一的入口文件

    完事就是来构建装饰器接口,Think/decorator.php,如下:

    <?php
    /**
     * 装饰器接口
     * Interface decorator
     * @package Think
     */
    namespace Think;
    interface decorator{
      public function beforeDraw();
      public function afterDraw();
    }
    
    

    再来就是颜色装饰器 Think/colorDecorator.php,如下:

    <?php
    /**
     * 颜色装饰器
     */
    namespace Think;
    class colorDecorator implements decorator{
      protected $color;
      public function __construct($color) {
        $this->color = $color;
      }
      public function beforeDraw() {
        echo "color decorator :{$this->color}\n";
      }
      public function afterDraw() {
        echo "end color decorator\n";
      }
    }
    
    

    还有就是字体大小装饰器 Think/sizeDecorator.php,如下:

    <?php
    /**
     * 字体大小装饰器
     */
    namespace Think;
    class sizeDecorator implements decorator{
      protected $size;
      public function __construct($size) {
        $this->size = $size;
      }
      public function beforeDraw() {
        echo "size decorator {$this->size}\n";
      }
      public function afterDraw() {
        echo "end size decorator\n";
      }
    }
    
          

    内容版权声明:除非注明,否则皆为本站原创文章。

    转载注明出处:http://www.heiqu.com/4111.html