algorytm.org

Implementacja w Java



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Dekorator (decorator) - Implementacja w Java
Ocena użytkownikóww: *****  / 12
SłabyŚwietny
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());
	}
	
}
 
Komentarze
photo
+1 # Paweł9393 2015-11-26 13:32
W klasie Main nie powinien być tworzony nowy obiekt Mercedes lub Fiat na przyklad przed dodaniem danych o oponach zimowych? Bez tworzenia nowego obiektu s1 i s2 są instancjami klasy Klimatyzacja, przez co cena wyswietlana jest 0.0. Jest tu gdzieś błąd czy ja się mylę ? :)
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+15 # Czocher 2016-01-15 18:03
Ta wersja dekoratora jest ogromnie bezsensowna. Przypominam, że w Java gdy obiekt dziedziczy z innego to dziedziczy nie tylko metody, ale również pola. Stąd konstrukcje typu OponyZimowe extends Dekorator { private Samochód s; } gdy Dekorator dziedziczy z Samochód powoduje, że wszystkie pola klasy Samochód są zdublowane, raz przez dziedziczenie, raz przez kompozycję.

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.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Woj 2016-03-10 13:29
Dokładnie jak Czocher napisał, nie można tworzyć obiektów klasy abstrakcyjnej == nie można wybrać golasa :)
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz