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

试图在php中实现(理解)Decorator模式

发布时间:2020-12-13 18:04:36 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试理解Decorator模式,我已经阅读了其他相关问题,然后我决定尝试一个简单的例子(我是一个 PHP新手): interface iTitle { public function getTitle();}class Title implements iTitle { protected $_text; public function __construct() { $this-_t
我正在尝试理解Decorator模式,我已经阅读了其他相关问题,然后我决定尝试一个简单的例子(我是一个 PHP新手):
interface iTitle {
   public function getTitle();
}

class Title implements iTitle {
   protected $_text;

   public function __construct() {
      $this->_text='Our page';
   }

   public function getTitle() {
      return $this->_text;
   }
}

abstract class TitleDecorator implements iTitle {
   protected $_title;

   public function __construct(iTitle $title) {
      $this->_title=$title;
   }
}

class BeforeTitle extends TitleDecorator {
   public function getTitle() {
      return 'Welcome to '.$this->_title->getTitle();
   }
}

class AfterTitle extends TitleDecorator {
   public function getTitle() {
      return $this->_title->getTitle().',Dear user!';
   }
}

这是Decorator模式的一种(某种)正确的实现吗?
如果不是,那么正确的方法是什么?
如果是的话,这可以改进吗?
或者这可能更适合另一种模式?

任何帮助/想法将不胜感激,提前感谢!

Is this a (kind of) right implementation of the Decorator pattern?

If yes,could this be improved and how? Or maybe this would be more suitable for another pattern?

那么你实现了装饰模式.当你想要实现一个时,我无法想象什么是比装饰器模式更好的模式.

通常,人们会使用Decorator来实现一个接口,并只替换原始对象的一小部分并传递其余部分.这严重依赖于对象的使用.由于您的代码仅显示如何实现模式而不是对象的使用,因此无论该模式是否符合您的需要,都无法具体回答.

所以你也可以实现其他模式,然后决定哪个模式感觉更好.模式的关键是:只有当你知道哪些存在时,你才能利用它们.

所以除了模式和决定选择哪一个经常是OOAD.如果你是新来的,checkout this nice book.

关于你的代码

当你问起这是否正确时,我首先回答是.它是正确的,但这部分看起来对我来说是错误的第二眼:

class BeforeTitle extends TitleDecorator {
   public function getTitle() {
      return 'Welcome to '.$this->getTitle();
   }
}

这是错误的,因为类BeforeTitle中的getter以递归方式调用自身(它一次又一次地调用自身……).我认为这不是你想要的.

你在另一个装饰器类中更正,指的是$this-> _title,它是被装饰的对象实例:

class AfterTitle extends TitleDecorator {
   public function getTitle() {
      return $this->_title->getTitle().',Dear user!';
   }
}

如果要替换/扩展对象行为,可以使用Decorator模式,但是您希望不需要完全重写对象功能.但其他人可以比我更好地描述.

(编辑:李大同)

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

    推荐文章
      热点阅读