Nadesłany przez Kamil Dworak, 14 sierpnia 2010 22:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
dekorator.java:
/****************************************
* Wzorzec Projektowy Decorator *
* (dekorator ) *
* www.algorytm.org *
* Opracowal Dworak Kamil *
*****************************************/
/* Standardowy nieudekorowany samochod */
abstract class Samochod {
protected String samochod = "Samochod podstawowy";
public String about(){
return samochod;
}
public abstract double cena();
}
/* abstrakcyjny dekorator */
abstract class Dekorator extends Samochod {
public abstract String about();
}
/* teraz mamy 2 przykladowe marki samochodow */
class Mercedes extends Samochod {
public Mercedes(){
samochod = "Mercedes";
}
public double cena(){
return 500000;
}
}
class Fiat extends Samochod {
public Fiat(){
samochod = "Fiat";
}
public double cena(){
return 100000;
}
}
/* czas na same dodatki */
class Klimatyzacja extends Dekorator {
Samochod samochod;
public Klimatyzacja(Samochod samochod){
this.samochod = samochod;
}
public String about(){
return samochod.about() + " + klimatyzacja";
}
public double cena(){
if(samochod instanceof Mercedes){
return samochod.cena()+100000;
}
else if(samochod instanceof Fiat){
return samochod.cena()+20000;
}
return 0.;
}
}
class OponyZimowe extends Dekorator {
Samochod samochod;
public OponyZimowe(Samochod samochod){
this.samochod = samochod;
}
public String about(){
return samochod.about() + " + opony zimowe";
}
/* niech ceny beda takie same */
public double cena(){
return samochod.cena()+31234;
}
}
public class Main {
public static void main(String[]args){
Samochod s1 = new Mercedes();
Samochod s2 = new Fiat();
System.out.println("\nBez wyposazenia");
System.out.println(s1.about() + " " + s1.cena());
System.out.println(s2.about() + " " + s2.cena());
//dodajemy po klimie
s1 = new Klimatyzacja(s1);
s2 = new Klimatyzacja(s2);
System.out.println("\nZ Klima");
System.out.println(s1.about() + " " + s1.cena());
System.out.println(s2.about() + " " + s2.cena());
// i opony
s1 = new OponyZimowe(s1);
s2 = new OponyZimowe(s2);
System.out.println("\nZ oponami");
System.out.println(s1.about() + " " + s1.cena());
System.out.println(s2.about() + " " + s2.cena());
//odrazu tworzymy wyposazony samochod
System.out.println("\nPelne wyposazenie");
Samochod s3 = new OponyZimowe(new Klimatyzacja(new Mercedes()));
System.out.println(s3.about() + " " + s3.cena());
}
}


Lepsza wersja powstałaby przez stworzenie interfejsu ISamochód i jego implementację zarówno przez klasę Samochód jak i przez Dekoratory Samochodu - nie występuje wtedy dziedziczenie pól, pamięć zostaje oszczędzona.