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.