Wpis z mikrobloga

Czy można połączyć wzorzec dekorator z (chyba)strategią? Projekt związany z pizzerią.
Pizza ma listę składników, które są obiektami implementującymi interfejs Addition, i chciałbym, abym mógł dekorować pizzę każdym składnikiem, czyli coś w stylu:
public class Ham implements Addition extends AdditionDecorator
Ma to sens?
#java #programowanie
  • 22
@Philopolemus_Fronius:

Pizza pizza = new CheesePizza(list);
Pizza pizza = new Ham(pizza);

I z tego powinna wyjść pizza serowa z dodatkową szynką. I zastanawiam się, czy takie rozwiązanie jest dobre czy może coś za bardzo przekombinowuję.
@Vengard:

Czemu nieprawidłowy?


Powiedziałem czemu

Pizza pizza = new CheesePizza(list); <- tworzysz zmienną o nazwie pizza
Pizza pizza = new Ham(pizza); <- Próbujesz drugi raz utworzyć zmienną o nazwie pizza
@Vengard:

Teraz jest błąd semantyczny.

Pizza pizza = new CheesePizza(); <- tworzysz zmienną typu pizza przechowującą obiekt typu CheesePizza. To jest ok
pizza = new Ham(pizza); <- nadpisujesz zawartość, więc CheesePizza jest usuwana a w jej miejsce wstawiany nowy obiekt

To tak jakbyś zrobił

int x = 10;
x = 50;

i oczekiwał, ze w x będzie 60
Ogólnie przeczytałem książkę o wzorcach projektowych, i teraz staram się ją przerobić lepiej tworząc projekt, i używając ich w niej.
@Philopolemus_Fronius: klasa Ham miałaby raczej wygladać tak:
//AdditionDecorator dziedziczy z pizzy
public class Ham extends AdditionDecorator implements Addition {
Pizza pizza;
public Ham(Pizza pizza) { this.pizza = pizza; }
//w tym miejscu np. nadsłaniać metodę toString pizzy (korzystanie z wzorca dekorator)
@ Override
public String toString() {
return pizza.toString() + "z