如何解决试图在php中实现理解Decorator模式
|| 我试图了解Decorator模式,并且阅读了SO上的其他相关问题,然后决定尝试一个简单的示例(我是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模式的(某种)正确实现吗?
如果没有,正确的方法是什么?
如果是,是否可以改善?如何改善?
也许这会更适合其他模式?
任何帮助/想法将不胜感激,在此先感谢!
解决方法
这是Decorator模式的(某种)正确实现吗?
是
如果是,是否可以改善?如何改善?也许这会更适合其他模式?
好了,您实现了装饰器模式。我无法想象要实现一个比装饰器模式更好的模式。
通常,可以使用Decorator来实现一个接口,并仅替换原始对象的一小部分,然后将其余对象传递出去。这在很大程度上取决于对象的用法。由于您的代码仅显示如何实现模式,而不显示对象的使用,因此,如果该模式符合您的需求,则无法具体回答。
因此,您也可以实施其他模式,然后确定哪种模式感觉更好。模式的症结在于:只有知道存在的模式,才能使用它们。
因此,除了模式以及经常选择哪种模式之外,还有OOAD。如果您是新手,请阅读这本好书。
关于您的代码
当您询问是否正确时,我首先回答是。有点对,但是第二眼看来这部分对我来说确实是错误的:
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模式。但是其他人可以比我描述得更好。
, 在装饰器模式中,您应该始终注入未在构造器内部初始化的值。范例:
这是错误的方式。
class Title implements iTitle {
protected $_text;
public function __construct() {
$this->_text=\'Our page\';
}
public function getTitle() {
return $this->_text;
}
}
这是正确的方法:
class Title implements iTitle {
protected $_text;
public function __construct($text) {
$this->_text=$text;
}
public function getTitle() {
return $this->_text;
}
}
如果您需要更详细的真实示例,请参见此处的链接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。