2015-02-01 2 views
1

Я просматриваю книгу «Образцы первых образцов дизайна» и специально смотрю пример Starbuzz для шаблона Decorator.Глава Первые образцы дизайна - узор-декоратор с использованием Starbuzz

У меня возникли проблемы с пониманием того, что именно необходимо для CondimentDecorator в приведенном примере. Почему не может Mocha просто увеличить Beverage? Что нужно для другого слоя абстракции? `

public abstract class Beverage 
{ 
    String description = "Unknown beverage"; 

    public String getDescription() 
    { 
    return description; 
    } 

    public abstract double cost(); 
} 

public abstract class CondimentDecorator extends Beverage 
{ 
    public abstract String getDescription(); 
} 

public class Mocha extends CondimentDecorator 
{ 
    Beverage b; 

    public Mocha(Beverage b) 
    { 
    this.b=b; 
    } 

    public String getDescription() 
    { 
     return b.getDescription() + ", Mocha"; 
    } 

    public double cost() 
    { 
    return .20 + b.cost(); 
    } 
} 
+0

Посмотрите на поток сжатия и шифрования в .Net –

+0

Также его лучше всего подходит здесь. http://programmers.stackexchange.com/ –

+0

Лучше подходит для http://codereview.stackexchange.com/ также –

ответ

2

Ну, в образце вы разместили ее isin't, что понятный, но абстрактный класс, как правило, берет на себя компоненту инкапсуляции и реализация метода по умолчанию должны делегировать метод вызывает этот компонент.

Поэтому при реализации бетонных декораторов вам не придется переопределять все методы, если вам это не нужно.

например.

public abstract class CondimentDecorator extends Beverage { 
    Beverage beverageToDecorate; 

    public CondimentDecorator(Beverage beverageToDecorate) { 
     this.beverageToDecorate = beverageToDecorate; 
    } 

    public String getDescription() { 
     return beverageToDecorate.getDescription(); 
    } 

    public double cost() { 
     return beverageToDecorate.cost(); 
    } 
} 
+0

Но если у меня есть экземпляр Beverage в бетонном декораторе, то в чем преимущество использования абстрактного декоратора поверх него? Пример, который вы показали, возвращает значения полей только в экземпляре Beverage, что я могу сделать и в конкретном декораторе. – collegian

+0

@collegian Да, но теперь вам не нужно дублировать этот код во всех бетонных декораторах, и вы можете переопределить только те методы, которые вам нужны в конкретных декораторах, а не во всех из них. В этом конкретном случае вы, вероятно, всегда будете переопределять оба метода, но это не так для каждого декоратора. – plalx

+0

Спасибо, это имеет смысл. Наверное, я попытаюсь посмотреть на несколько лучших примеров. – collegian

1

Почему не мокко просто расширить Beverage? Какая потребность в другом слое абстракции?

Проблема заключается в том, как бороться с комбинациями. Mocha - это только один вариант, но как насчет Mocha + House Blend + Steam Milk и т. Д. На p.81 дизайнерского решения есть прекрасное изображение, использующее только этот «слой», который имеет так много классов, наследующих от Beverage, что это «обслуживание» кошмар."

CondimentDecorator позволяет добавлять любое количество комбинаций к вашему Beverage через композиции, а не наследования.

+0

Я думаю, я вижу, что дублирование происходит, если в Beverage внедряются новые методы, и некоторые из них распространены во всех приправах. Можете ли вы привести еще несколько примеров кошмара обслуживания? Я подумал, что изображение на стр. 81 показало все возможные сценарии в своем собственном классе и, следовательно, отличалось от вышеприведенного сценария, где каждый Кондимент и каждый конкретный напиток - это собственный класс. Кроме того, в текущем сценарии используется экземпляр напитка в каждом конкретном приправе. Если Mocha + House Blend + Milk входит, тогда мокко и молоко будут вычислять свои собственные затраты и добавлять стоимость дома Blend. – collegian

+0

Нет, дело не в новых методах. Речь идет о сочетании вариантов приправ и напитков. стр.81 также имеет приправы. Все необходимые вам примеры. Это не хуже, чем класс под названием «HouseBlendWithWhipandSoy»! Что касается расчета затрат, см. Стр.89-90. Декораторы обертывают другие Напитки. – Fuhrmanator

+0

Я не думаю, что вы поняли мой вопрос. Изображение на стр. 81 отличается от вопроса, который я задаю. На стр. 81 каждый возможный вариант объединяется в один класс, и я вижу классный взрыв. В приведенном выше сценарии каждый Condiment and Beverage - это собственный класс, и никакой комбинации не происходит. – collegian

Смежные вопросы