Wzorzec projektowy Decorator

Zadanie programistyczne

Smoki zakładają kawiarnię, gdzie będą podawać 4 ludzkie napoje, z których każdy
może mieć od 0 do 4 dodatków smakowych. Tworzenie kilkunastu klas nie miałoby
sensu, wiec należy wymyślić coś innego.

Rozwiązanie:

Utworzyć abstrakcyjna klasę Potrawa.
Każdy główny napój: kawa, czekolada, kakao, ambrozja – dziedziczy po tej klasie.
Abstrakcyjna klasa Dodatek dziedziczy po klasie Potrawa.
Każdy dodatek: miód, mleko, śmietanka, sok – dziedziczy po klasie Dodatek.
Do każdej potrawy można dodać dowolną ilość dodatków
Koszt składników jest dodawany do potrawy.

Klasy

Pakiet potrawy

Klasa Potrawa
package decorator.potrawy;
public abstract class Potrawa {
	protected String opis = "";
	public String getOpis() {
		return opis;
	}
	public abstract double koszt();
}

Pakiet dodatki

Klasa Dodatek
package decorator.dodatki;
import decorator.potrawy.*;
public abstract class Dodatek extends Potrawa {
	@Override
	public abstract String getOpis();
}
Klasa Miod
package decorator.dodatki;
import decorator.potrawy.*;
public class Miod extends Dodatek {
	private final Potrawa skladnik;
	public Miod(Potrawa skladnik) {
		this.skladnik = skladnik;
	}
	@Override
	public String getOpis() {
		return skladnik.getOpis() + ", Miód";
	}
	@Override
	public double koszt() {
		return .20 + skladnik.koszt();
	}
}
Klasa Mleko
package decorator.dodatki;
import decorator.potrawy.*;
public class Mleko extends Dodatek {
	private final Potrawa skladnik;
	public Mleko(Potrawa skladnik) {
		this.skladnik = skladnik;
	}
	@Override
	public String getOpis() {
		return skladnik.getOpis() + ", Mleko";
	}
	@Override
	public double koszt() {
		return .10 + skladnik.koszt();
	}
}
Klasa Smietanka
package decorator.dodatki;
import decorator.potrawy.*;
public class Smietanka extends Dodatek {
	private final Potrawa skladnik;
	public Smietanka(Potrawa skladnik) {
		this.skladnik = skladnik;
	}
	@Override
	public String getOpis() {
		return skladnik.getOpis() + ", Śmietanka";
	}
	@Override
	public double koszt() {
		return .15 + skladnik.koszt();
	}
}
Klasa Sok
package decorator.dodatki;
import decorator.potrawy.*;
public class Sok extends Dodatek {
	private final Potrawa skladnik;
	public Sok(Potrawa skladnik) {
		this.skladnik = skladnik;
	}
	@Override
	public String getOpis() {
		return skladnik.getOpis() + ", Sok";
	}
	@Override
	public double koszt() {
		return .10 + skladnik.koszt();
	}
}

Pakiet napoje

Klasa Ambrozja
package decorator.napoje;
import decorator.potrawy.*;
public class Ambrozja extends Potrawa {
	public Ambrozja() {
		opis = "Ambrozja";
	}
	@Override
	public double koszt() {
		return 5.99;
	}
}
Klasa Czekolada
package decorator.napoje;
import decorator.potrawy.*;
public class Czekolada extends Potrawa {
	public Czekolada() {
		opis = "Czekolada";
	}
	@Override
	public double koszt() {
		return 5.05;
	}
}
Klasa Kakao
package decorator.napoje;
import decorator.potrawy.*;
public class Kakao extends Potrawa {
	public Kakao() {
		opis = "Kakao";
	}
	@Override
	public double koszt() {
		return 2.89;
	}
}
Klasa Kawa
package decorator.napoje;
import decorator.potrawy.*;
public class Kawa extends Potrawa {
	public Kawa() {
		opis = "Kawa";
	}
	@Override
	public double koszt() {
		return 3.99;
	}
}

Wyniki

Klasa Main
package decorator;
import decorator.dodatki.*;
import decorator.napoje.*;
import decorator.potrawy.*;
class Main {
	public static void main(String args[]) {
		Potrawa potrawa = new Kawa();
		System.out.println(potrawa.getOpis() + " " + potrawa.koszt() + " zł");
		Potrawa potrawa2 = new Ambrozja();
		potrawa2 = new Miod(potrawa2);
		System.out.println(potrawa2.koszt());
		potrawa2 = new Miod(potrawa2);
		System.out.println(potrawa2.koszt());
		potrawa2 = new Sok(potrawa2);
		System.out.println(potrawa2.koszt());
		System.out.println(potrawa2.getOpis() + " " + potrawa2.koszt() + " zł");
		Potrawa potrawa3 = new Kakao();
		potrawa3 = new Smietanka(potrawa3);
		potrawa3 = new Miod(potrawa3);
		potrawa3 = new Sok(potrawa3);
		System.out.println(potrawa3.getOpis() + " " + potrawa3.koszt() + " zł");
	}
}
Kawa 3.99 zł
6.19
6.390000000000001
6.49
Ambrozja, Miód, Miód, Sok 6.49 zł
Kakao, Śmietanka, Miód, Sok 3.3400000000000003 zł

Uwagi

W podanym przykładzie brakuje – dla uproszczenia – setterów i getterów pozwalających
na zmiany opisów i cen.
Do zaokrąglania wyników można użyć mojej metody zaokrąglanie liczb double i float

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *