Sha*_*haz 7 php design-patterns
我正在尝试理解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!';
}
}
Run Code Online (Sandbox Code Playgroud)
这是Decorator模式的一种(某种)正确的实现吗?如果不是,那么正确的方法是什么?如果是的话,这可以改进吗?或者这可能更适合另一种模式?
任何帮助/想法将不胜感激,提前感谢!
这是Decorator模式的一种(某种)正确的实现吗?
是
如果是的话,这可以改进吗?或者这可能更适合另一种模式?
那么你实现了装饰模式.当你想要实现一个时,我无法想象什么是比装饰器模式更好的模式.
通常,人们会使用Decorator来实现一个接口,并只替换原始对象的一小部分并传递其余部分.这严重依赖于对象的使用.由于您的代码仅显示如何实现模式而不是对象的使用,因此无论该模式是否符合您的需要,都无法具体回答.
所以你也可以实现其他模式,然后决定哪个更好.模式的关键是:只有当你知道哪些存在时,你才能使用它们.
因此,除了模式和决定选择哪一个通常是OOAD.如果你是新手,请查看这本好书.
当你问起这是否正确时,我首先回答是.它是正确的,但这部分看起来对我来说是错误的第二眼:
class BeforeTitle extends TitleDecorator {
public function getTitle() {
return 'Welcome to '.$this->getTitle();
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为类中的getter以BeforeTitle递归方式调用自身(它一次又一次地调用自身......).我认为这不是你想要的.
你在另一个decorator类中做正确的,指的是$this->_title哪个是被装饰的对象实例:
class AfterTitle extends TitleDecorator {
public function getTitle() {
return $this->_title->getTitle().', Dear user!';
}
}
Run Code Online (Sandbox Code Playgroud)
如果要替换/扩展对象行为,可以使用Decorator模式,但是如果需要完全重写对象功能,则可以使用它.但其他人可以比我更好地描述.