Имеет ли значение, когда декоратор вызывается (в начале или в конце метода) в шаблоне декоратора? - PullRequest
0 голосов
/ 05 июня 2009

Я реализую шаблон декоратора в Javascript.

Я видел пример здесь в Википедии

// Class to be decorated
function Coffee() {
    this.cost = function() {
    return 1;
    };
}

// Decorator A
function Milk(coffee) {
    this.cost = function() {
    return coffee.cost() + 0.5;
    };  
}

// Decorator B
function Whip(coffee) {
    this.cost = function() {
    return coffee.cost() + 0.7;
    };
}

// Decorator C
function Sprinkles(coffee) {
    this.cost = function() {
    return coffee.cost() + 0.2;
    };
}

// Here's one way of using it
var coffee = new Milk(new Whip(new Sprinkles(new Coffee())));
alert( coffee.cost() );

// Here's another
var coffee = new Coffee();
coffee = new Sprinkles(coffee);
coffee = new Whip(coffee);
coffee = new Milk(coffee);
alert(coffee.cost());

Теперь мой вопрос: шаблон все еще будет шаблоном декоратора, имеет ли значение, если родительский класс вызывается в начале или в конце функции cost ()?

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

Но есть ли какая-либо причина для совершения звонка до или после, кроме причины, указанной в предыдущем абзаце?

Ответы [ 4 ]

1 голос
/ 05 июня 2009

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

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

1 голос
/ 05 июня 2009

Неважно. Предполагается, что декоратор изменяет поведение объекта, то, как он это делает, является лишь вопросом реализации.

0 голосов
/ 08 июня 2009

Хорошо, нашел ответ.

Я вернулся и перечитал часть «Шаблон декоратора» в моей книге по шаблонам дизайна и обнаружил:

"Декоратор добавляет свое собственное поведение до и / или после , делегируя объект, который он декорирует, для выполнения остальной части работы."

С акцентом на биты до и / или после ...

Извините, что беспокою вас, и спасибо за ответы.

0 голосов
/ 05 июня 2009

Будьте осторожны с

new X(new Y(new Z())))

конструкции типа. У этого есть несколько подводных камней (я парень по Java, поэтому я привожу пару примеров Java, но концепции действительно применимы везде)

  • У вас нет доступа к вложенным объектам

    • Иногда вам это нужно, например, если вы декорируете объекты Java IO и происходит сбой закрытия (), вам нужно попробовать закрыть вложенные объекты)
    • Иногда вам нужно или вы хотите установить дополнительные данные
    • Иногда вам нужно получить результат из вложенного элемента (новый PrintWriter (new StringWriter ()) - вам нужно получить результирующую строку из StringWriter
  • Если вы получаете исключение (или другой тип ошибки), трудно сказать, что произошло, основываясь на сообщенном номере строки

  • Труднее пройти через отладку (зависит от отладчика)
  • Труднее что-то вставить в середину
  • В середине что-то сложнее удалить
  • Труднее переоформить заказ
...