Декоратор Pattern с конкретными методами декоратора в Java - PullRequest
6 голосов
/ 27 декабря 2011

Используя пример декоратора кофе, показанный в Википедии (http://en.wikipedia.org/wiki/Decorator_pattern)), как кто-то может иметь методы, которые есть только у декораторов, например, у декоратора молока может быть метод с именем fatContent". Возможно ли это даже с этим типом шаблона проектирования? Если нет, какой тип шаблона я мог бы использовать для достижения этой цели?

Ответы [ 3 ]

9 голосов
/ 27 декабря 2011

Вы могли бы , но вам нужно знать тип, чтобы на самом деле вызвать метод (при условии отсутствия отражения и т. Д.), Если он не соответствует типу, который вы

Типы определяют то, что известно во время компиляции: если CoffeeDecorater не содержит подпись fatContent, ничто, получающее CoffeeDecoractor, не знает, что метод существует.

Вы можете создать дополнительный интерфейс, но вам нужно будет либо знать, что он существует, чтобы вы могли проверить его (instanceof), либо опросить класс, чтобы проверить наличие конкретной подписи (отражения).

Java либо знает, что метод существует во время компиляции, либо проверяет его во время выполнения.

4 голосов
/ 27 декабря 2011

Декораторы могут иметь любое количество определенных методов.Вы можете представить интерфейс, специфичный для декоратора, который реализует декоратор в дополнение к реализации декорированного интерфейса.

Однако кто-то должен знать, что эти методы существуют, поэтому либо декоратор должен вызывать метод внутри, а вызывающий должен знатьон использует декоратор вместо декорированного объекта (вы можете проверить, используя instanceof) или использовать отражение, чтобы проверить эти методы.

3 голосов
/ 27 декабря 2011

Шаблон декоратора по определению не позволяет добавлять методы, отличные от тех, которые определены в интерфейсе.На самом деле вы всегда можете добавить методы в любой класс, но как только эти методы не определены в реализующем интерфейсе, клиент не может вызывать их с помощью этого интерфейса.

Простым решением вашей проблемы является определение нескольких интерфейсов, например, Coffee and Milk.Затем вы можете определить класс Capuchino, который реализует оба интерфейса и, вероятно, содержит 2 экземпляра: SimpleCofee и FoamedMilk.Но это решение выглядит скорее как сочетание Decorator и Facade.

...