В шаблоне декоратора как убедиться, что элемент самого низкого уровня не является декоратором? - PullRequest
1 голос
/ 21 марта 2020

В шаблоне Decorator вы должны обернуть декораторы вокруг одного центрального компонента ConcreteComponent. Но, насколько я вижу из анализа диаграммы классов ( из Википедии ), ничто не мешает мне использовать ConcreteDecorator в качестве центрального элемента. И это, очевидно, не очень хорошо, потому что его реализация operation(), скорее всего, содержит component.operation(). Я что-то здесь скучаю? Есть ли охранник, которого я не вижу, который гарантирует, что центральным элементом, который украшается, является ConcreteComponent?

decorator pattern class diagram

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Возможно, есть несколько способов, но я бы ожидал, что Decorator будет иметь такой код

abstract class Decorator implements Component {
    protected final Component decorated;
    protected Decorator(Component comp) {
        if (comp == null) {
            throw new IllegalArgumentException("must have decoration target");
        }
        decorated = comp;
    }
}

В качестве альтернативы, если, например,. Decorator - это interface, вы можете просто утверждать, что наличие действующего украшателя является предварительным условием для работы operation().

0 голосов
/ 21 марта 2020

Вы можете использовать ваш ConcreteDecorator в качестве центрального элемента. Идея состоит не в том, чтобы ограничить вас от этого, а в том, чтобы дать вам возможность иметь несколько декораторов, и ваш клиент может обращаться с ними единообразно.

В основном тип вашей переменной должен быть Decorator ( абстракция) и ваша зависимость во время выполнения может быть любым подклассом этой абстракции, который вам нравится. Идея состоит в том, чтобы отделить детали реализации от абстракции. Таким образом, вы можете прикрепить различные декораторы во время выполнения и изменить поведение или добавить состояние. Сила использования абстракции, а не конкреции, заключается в том, что вы можете изменять конкрецию во время выполнения, если ваш тип переменной - Декоратор (абстракция)

0 голосов
/ 21 марта 2020

Вам не нужна такая проверка. Более того - не только вам это не нужно, но и не должно быть. Наличие одного сломает абстракцию.

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

...