脚本宝典收集整理的这篇文章主要介绍了试图在php中实现(理解)Decorator模式,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
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模式的一种(某种)正确的实现吗?
如果不是,那么正确的方法是什么?
如果是的话,这可以改进吗?
或者这可能更适合另一种模式?
任何帮助/想法将不胜感激,提前感谢!
是
那么你实现了装饰模式.当你想要实现一个时,我无法想象什么是比装饰器模式更好的模式.
通常,人们会使用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模式,但是您希望不需要完全重写对象功能.但其他人可以比我更好地描述.
以上是脚本宝典为你收集整理的试图在php中实现(理解)Decorator模式全部内容,希望文章能够帮你解决试图在php中实现(理解)Decorator模式所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。