Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (2)
  • Как бы вы реализовали такую архитектуру в рамках PHP?

    @Alexei_987
    прошу прощения за Ctrl + Enter :)

    необходимо создать интерфейс:
    interface IDecorable {
      /**
       * @return IDecorable
       */
      removeDecorator(IDecorable $decorator);
    }
    

    декорируемый обьект должен реализовать интерфейс с помощью заглушки:
      //....
      /**
       * @return IDecorable
       */
      removeDecorator(IDecorable $decorator) {
          return $this;
      }
      //...
    


    а все декораторы могут наследоваться от абстрактного декоратора в котором будет вот такая реализация данного интерфейса:
      //....
      /**
       * @var IDecorator
       */
      private $decorableObject;
      /**
       * @return IDecorable
       */
      removeDecorator(IDecorable $decorator) {
        if($decorator == $this) {
          return $this->decorableObject;
        }
        $decorable = $this->decorableObject->removeDecorator($decorator);
        if($decorable != $this->decoratedObject) {
           $this->decoratedObject = $decorable;
        }
        return $this;
      }
      //...
    


    Таким образом обьекты смогут использоваться следующим образом:
    $decorated = $decorated->removeDecorator($decorated); 
    

    Такой код может удалить самый верхний декоратор обьекта или вернет сам обьект если у него нет декораторов.
    Для удаления произвольного декоратора из цепочки нужно передать в качестве параметра этот декоратор или декоратор с аналогичными свойствами:
    $decorated = $decorated->removeDecorator($someOtherDecorator); 
    
    Ответ написан
    1 комментарий