Другие языки программирования и технологии

Вопрос по паттерну "Декоратор" в Java

Начали изучать паттерны... На теории всё красиво и понятно, на практике я ещё ничего не делал. Цель: создать свадебную открытку(WeddingCard) с рамочкой(BorderDecorator), логотипом(LogoDecorator) и ChimeDecorator. Внизу я выкладываю "скелет" классов, ничего конкретно писать в методах не нужно. Куда мне поместить строчку Card c = new BorderDecorator(new LogoDecorator(new ChimeDecorator(myCard))) ? Я так понимаю, что в класс WeddingCard или я ошибаюсь? Если я прав, то где вызывать печать c.print() ? Спасибо огромное, ниже схема классов
Да, думаю, именно так (хотя жабой после института не занимался, вроде с ООП все тут в порядке) .
А c.Print - конечно, в WeddingCard.print.
ИК
Игорь Козловский
89 305
Лучший ответ
Елубай Джайнаусов Спасиб за ответ! А на чём пишешь сейчас?
Помещать ее нужно туда где Вам нужно будет непосредственно сделать оформление.

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

Мне казалось бы более логичным иметь в данном случае либо Builder, либо Factory, которая бы создавала различные типы открыток.

class WeddingCardFactory {
public Card newBorderedWeddingCard() {return new BorderDecorator(new WeddingCard()); }
public Card newFullWeddingCard() {return new BorderDecorator(new LogoDecorator(new ChimeDecorator(new WeddingCard())));
};

либо на какой-либо оформительский класс

class CardBuilder {
Card makeBordered(Card card) {return new BorderDecorator(card);}
Card addLogo(Card card) {return new LogoDecorator(card);}
}

Смысл декоратора - это добавить обрамление. Смысл же WeddingCard (судя по диаграмме) - это просто добавить в базовый Card какую-то дополнительную информацию. А у Вас получается что Вы начинаете загружать этот объект формированием представления - это по логике не его задача.. .

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

имхо.. .
Влад Панин
Влад Панин
936
Елубай Джайнаусов Это просто пример, который нам показали на лекции. Я нутром чуял, что что-то тут неладно)