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

Да, думаю, именно так (хотя жабой после института не занимался, вроде с ООП все тут в порядке) .
А c.Print - конечно, в WeddingCard.print.
А c.Print - конечно, в WeddingCard.print.
Елубай Джайнаусов
Спасиб за ответ! А на чём пишешь сейчас?
Помещать ее нужно туда где Вам нужно будет непосредственно сделать оформление.
Но та часть которая касается 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 какую-то дополнительную информацию. А у Вас получается что Вы начинаете загружать этот объект формированием представления - это по логике не его задача.. .
Эти операции нужно выносить на другой уровень. Задача этой иерархии - дать такую возможность, но использовать ее нужно там где это требуется по логике приложения.
имхо.. .
Но та часть которая касается 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 какую-то дополнительную информацию. А у Вас получается что Вы начинаете загружать этот объект формированием представления - это по логике не его задача.. .
Эти операции нужно выносить на другой уровень. Задача этой иерархии - дать такую возможность, но использовать ее нужно там где это требуется по логике приложения.
имхо.. .
Елубай Джайнаусов
Это просто пример, который нам показали на лекции. Я нутром чуял, что что-то тут неладно)
Похожие вопросы
- Два вопроса по организации несложного сайта, Java и PHP
- Вопрос по Java (хочу научиться)
- Вопросы по JAVA (Swing)! Я новичок.
- Что конкретно пишут на языке Java? Над чем работают ?
- Вопрос по Java!!!!
- Вопрос по JAVA.
- Проблема с Java
- Вопрос по Java
- Решил изучить Java. Есть вопрос
- JAVA - Server - Socket как обнаружить разрыв соединения.. Метод какой-нить есть?