Попытка реализовать (понять) шаблон Decorator в php - PullRequest
7 голосов
/ 15 июня 2011

Я пытаюсь понять шаблон 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?Если нет, что будет правильным?Если да, можно ли это улучшить и как?Или, может быть, это будет более подходящим для другого шаблона?

Любая помощь / идеи будут оценены, спасибо заранее!

Ответы [ 2 ]

6 голосов
/ 15 июня 2011

Это (своего рода) правильная реализация шаблона Decorator?

Да

Если да, можно ли это улучшить и как? Или, может быть, это будет более подходящим для другого шаблона?

Хорошо, вы реализовали Pattern Decorator. Я не могу представить, что может быть лучшим шаблоном, чем шаблон декоратора, если вы хотите его реализовать.

Обычно можно использовать Decorator для реализации интерфейса и замены только части оригинального объекта и передачи остальных. Это сильно зависит от использования объекта. Поскольку в вашем коде показано только то, как реализовать шаблон, но не использование объектов, на него не может быть конкретного ответа, если этот шаблон соответствует вашим потребностям.

Таким образом, вы можете реализовать и другие шаблоны, а затем решить, какой из них лучше. Суть шаблонов: только если вы знаете, что существует, вы можете использовать их.

Итак, рядом с шаблонами и решением о том, какой из них выбрать, часто стоит OOAD . Если вы новичок в этом, закажите эту прекрасную книгу .

О вашем коде

Я впервые ответил «да», когда вы спросили, правильно ли это или нет. В некотором смысле это правильно, но эта часть выглядит неправильно для меня с второго взгляда:

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

Это неправильно, потому что метод получения в классе BeforeTitle вызывает себя рекурсивно (он вызывает себя снова и снова и снова ...). Я думаю, что это не предназначено для вас.

Вы делаете это правильно в другом классе декоратора, ссылаясь на $this->_title, который является экземпляром объекта, который декорируется:

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

Вы можете использовать шаблон Decorator, если вы хотите заменить / расширить поведение объектов, но вы хотите сделать это без необходимости полностью переписывать функциональность объектов в целом. Но другие могут описать это лучше, чем я.

0 голосов
/ 21 ноября 2017

В шаблоне декоратора вы всегда должны вводить значение, а не инициализировать внутри конструктора. Пример : Это неправильный путь.

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;
   }
}

Если вам нужен более подробный пример из реальной жизни, см. Ссылку здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...