加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP设计模式之装饰器模式定义与用法简单示例

发布时间:2022-02-24 13:33:14 所属栏目:PHP教程 来源:互联网
导读:本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下: 装饰器模式: 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式。 简单点说:
  本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下:
 
  装饰器模式:
 
  如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式。
 
  简单点说:就是我们不应该去修改已有的类,而是通过创建另外一个装饰器类,通过这个装饰器类去动态的扩展其需要修改的内容,这样做的好处就是————
 
  1、我们可以保证类的层次不会因过多而发生混乱。
 
  2、当我们需求的修改很小时,不用改变原有的数据结构。
 
  代码引用自《PHP设计模式》。
 
  /**
  * 被修饰类
  现在的需求:
  要求能够动态为CD添加音轨、能显示CD音轨列表。
  显示时应采用单行并且为每个音轨都以音轨好为前缀。
  */
  class CD
  {
    public $trackList;
    function __construct()
    {
      # code...
      $this->trackList=array();
    }
    public function addTrack($track){
      $this->trackList[]=$track;
    }
    public function getTrackList(){
      $output=" ";
      foreach ($this->trackList as $key => $value) {
        # code...
        $output.=($key+1).") {$value}. ";
      }
      return $output;
    }
  }
  /*
  现在需求发生变化:
  要求将当前实例输出的音轨都采用大写形式。
  这个需求并不是一个变化特别大的需求,不需要修改基类或创建一个父子关系的子类,此时创建一个基于装饰器模式的装饰器类。
  */
  class CDTrackListDecoratorCaps{
    private $_cd;
    public function __construct(CD $CD){
      $this->_cd=$CD;
    }
    public function makeCaps(){
      foreach ($this->_cd->trackList as $key => $value) {
        # code...
        $this->_cd->trackList[$key]=strtoupper($value); //转换成大写
      }
    }
  }
  //客户端测试:
  $myCD=new CD();
  $trackList=array(
    "what It Means",
    "brr",
    "goodBye"
    );
  foreach ($trackList as $key => $value) {
    # code...
    $myCD->addTrack($value);
  }
  $myCDCaps=new CDTrackListDecoratorCaps($myCD);
  $myCDCaps->makeCaps();
  print "The CD contains the following tracks:".$myCD->getTrackList();
  运行结果:
 
  The CD contains the following tracks: 1) WHAT IT MEANS. 2) BRR. 3) GOODBYE.

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读