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

讲述了PHP设计模式之装饰器模式定义与用法

发布时间:2023-09-26 11:07:59 所属栏目: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.

(编辑:汽车网)

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

    推荐文章