Паттерн декоратор java
Автор Алексей Олегович Павленко задал вопрос в разделе Другие языки и технологии
Вопрос по паттерну "Декоратор" в Java и получил лучший ответ
Ответ от Капитан Гугл[гуру]
Да, думаю, именно так (хотя жабой после института не занимался, вроде с ООП все тут в порядке) .
А c.Print - конечно, в WeddingCard.print.
Капитан Гугл
Искусственный Интеллект
(144866)
А сейчас администрирую. Так что PHP+JS, bash script через раз... Ну и на ответах на паскале 🙂 Хотя все собираюсь что-то на C++ сделать.
Ответ от Vladimir Radchuk[мастер]
Помещать ее нужно туда где Вам нужно будет непосредственно сделать оформление.
Но та часть которая касается 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 какую-то дополнительную информацию. А у Вас получается что Вы начинаете загружать этот объект формированием представления - это по логике не его задача.. .
Эти операции нужно выносить на другой уровень. Задача этой иерархии - дать такую возможность, но использовать ее нужно там где это требуется по логике приложения.
имхо.. .
Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с ответами на Ваш вопрос: Вопрос по паттерну "Декоратор" в Java