При использовании шаблона Decorator, как вы декорируете дополнительную функциональность между конкретным определением функции? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь понять, правильно ли я использую шаблон Decorator, или другой шаблон лучше подходит для такой ситуации:

Без переопределения моего интерфейса я не могу украсить функциюпотому что это определение родителей мешает мне сделать это.Я не уверен, что мой вопрос ясен, так что, возможно, пример:

interface IFoo
{
    public function bar();
}

class ConcreteFoo implements IFoo
{
    public function bar()
    {
        echo "hello world!\n";
    }
}

abstract class Decorator implements IFoo
{
    public function __construct(IFoo $foo)
    {
        $this->foo = $foo;
    }

    public function bar()
    {
        $this->foo->bar();
    }
}

class BeautifulDecorator extends Decorator
{
    public function bar()
    {
        // I am unable to insert 'beautiful' between 'hello' and 'world' without redefining the bar() function again
        parent::bar();
    }
}

Ради простоты я по существу не могу распечатать что-то вроде «Привет, прекрасный мир», фактически не переопределяя планку.Функция для этого.

Есть ли способ сделать это с шаблоном Decorator, или есть другой шаблон, который можно использовать?

1 Ответ

0 голосов
/ 18 ноября 2018

Используйте Decorator, когда

  • вы хотите, чтобы объект выполнял дополнительные операции до и после выполнения метода

  • расширение с помощью подклассов можетпривести к взрыву подклассов для поддержки каждой комбинации операций

В вашем случае вы не хотите добавлять любые дополнительные операции до или после bar (), но вы действительно хотите заменить алгоритм этого метода, так что это не является целью Decorator

И если класс мешает вамот изменения его алгоритма, в вашем примере, нет способа попросить объект напечатать что-либо, кроме «hello world!», так что это означает, что поведение инкапсулировано в объект, и нет шаблонов, предназначенных для нарушения инкапсуляции.

Я считаю, что единственным решением здесь является изменение реализации ConcreteFoo или просто создание другого конкретного класса.

...