试图在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;
   }
}
如果您需要更详细的真实示例,请参见此处的链接。