Moin!
Ich stehe gerade vor der Aufgabe das Dekorator Muster umzusetzen. Das ganze soll anhand eines Autos mit unterschiedlicher Austattung gemacht werden.
Mein bisheriger Stand sieht nun so aus:
Das zu dekorierende Objekt ist meine Klasse Car:
Als ein konkretes Auto habe ich ferner noch eine BMW-Klasse erstellt:
Die Autos sollen nun mit Kindersitzen und SetTopBoxen "dekoriert" werden.
Am Ende möchte ich erfassen, welche Austattungsgegenstände für jedes Auto "gewählt" sind und den Gesamtpreis ermitteln.
Dafür habe ich nun einmal ein Interface Resource:
Und Kindersitze und SetTopBox:
Nachvollziehen kann ich den Code sowiet nur irgendwie habe ich das Gefühl, hier irgendwas falsch gemacht zu haben in Bezug auf das Dekorator Muster.
Mal davon abgesehen, dass "isSelected" noch nicht ausprogrammiert ist, funktioniert das Ganze doch irgendwie nicht so, wie es wohl eigentlich gedacht ist.
bmw1 funktioniert auch super, nur bei bmw2 bekomme ich logischerweise eine NullPointer, da es keinen Kindersitz gibt, von dem der Preis abgefragt werden könnte.
Nun könnte man in die Methode getPrice() in "CAR" wahrscheinlich mit ein paar IF-Abfragen z.B. das Problem umschiffen, aber ist das so der Sinn?
Irgendwas stimmt doch da nicht. Würde mich freuen, wenn ein geschultes Auge mir da weiterhelfen könnte!
Ich stehe gerade vor der Aufgabe das Dekorator Muster umzusetzen. Das ganze soll anhand eines Autos mit unterschiedlicher Austattung gemacht werden.
Mein bisheriger Stand sieht nun so aus:
Das zu dekorierende Objekt ist meine Klasse Car:
Java:
package car;
import features.Resource;
public abstract class Car {
private Resource childSeat;
private Resource setTopBox;
private int seats;
private float price;
Car(Resource childSeat, Resource setTopBox, int seats, float price ){
this.childSeat = childSeat;
this.setTopBox = setTopBox;
this.seats = seats;
this.price = price;
}
public int getSeats() {
return seats;
}
public void setSeats(int seats) {
this.seats = seats;
}
public Resource getChildSeat() {
return childSeat;
}
public void setChildSeat(Resource childSeat) {
this.childSeat = childSeat;
}
public Resource getSetTopBox() {
return setTopBox;
}
public void setSetTopBox(Resource setTopBox) {
this.setTopBox = setTopBox;
}
public float getPrice() {
return childSeat.getPrice() + setTopBox.getPrice() + price;
}
public void setPrice(float price) {
this.price = price;
}
}
Als ein konkretes Auto habe ich ferner noch eine BMW-Klasse erstellt:
Code:
package car;
import features.Resource;
public class BMW extends Car{
private boolean allWheelDrive;
public BMW(Resource childSeat, Resource setTopBox, boolean allWheelDrive, float price, int seats) {
super(childSeat, setTopBox, seats, price);
}
public boolean isAllWheelDrive() {
return this.allWheelDrive;
}
public float getPrice() {
return super.getPrice();
}
}
Die Autos sollen nun mit Kindersitzen und SetTopBoxen "dekoriert" werden.
Am Ende möchte ich erfassen, welche Austattungsgegenstände für jedes Auto "gewählt" sind und den Gesamtpreis ermitteln.
Dafür habe ich nun einmal ein Interface Resource:
Code:
package features;
public interface Resource {
boolean isSelected();
float getPrice();
}
Und Kindersitze und SetTopBox:
Code:
package features;
public class ChildSeat implements Resource{
private boolean isSelected;
private String model;
private float price;
public ChildSeat(){
}
public boolean getIsSelected() {
return this.isSelected;
}
public void setIsSelected(boolean selected) {
this.isSelected = selected;
}
public String getModel() {
return this.model;
}
public void setModel(String model) {
this.model = model;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public float getPrice() {
return this.price;
}
@Override
public boolean isSelected() {
// TODO Auto-generated method stub
return false;
}
}
Code:
package features;
public class SetTopBox implements Resource{
private boolean isSelected;
private String model;
private float price;
public SetTopBox(){
}
public boolean getIsSelected() {
return this.isSelected;
}
public void setIsSelected(boolean selected) {
this.isSelected = selected;
}
public String getModel() {
return this.model;
}
public void setModel(String model) {
this.model = model;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public float getPrice() {
// TODO Auto-generated method stub
return this.price;
}
@Override
public boolean isSelected() {
// TODO Auto-generated method stub
return false;
}
}
Nachvollziehen kann ich den Code sowiet nur irgendwie habe ich das Gefühl, hier irgendwas falsch gemacht zu haben in Bezug auf das Dekorator Muster.
Mal davon abgesehen, dass "isSelected" noch nicht ausprogrammiert ist, funktioniert das Ganze doch irgendwie nicht so, wie es wohl eigentlich gedacht ist.
Code:
Resource setTopBox = new SetTopBox();
Resource setTopBox = new SetTopBox();
((SetTopBox) setTopBox).setModel("BigBag");
((SetTopBox) setTopBox).setPrice(200.0f);
Resource childSeat = new ChildSeat();
((ChildSeat) childSeat).setModel("Little Man");
((ChildSeat) childSeat).setPrice(300.0f);
Car bmw1 = new BMW(childSeat, setTopBox, true, 1000f, 4);
System.out.println("Preis für BMW Mit Kindersitz und SettopBox" + bmw1.getPrice());
Car bmw2 = new BMW(setTopBox, null, true, 2000f, 4);
System.out.println("Preis für BMW mit nur Settopbox " + bmw2.getPrice());
bmw1 funktioniert auch super, nur bei bmw2 bekomme ich logischerweise eine NullPointer, da es keinen Kindersitz gibt, von dem der Preis abgefragt werden könnte.
Nun könnte man in die Methode getPrice() in "CAR" wahrscheinlich mit ein paar IF-Abfragen z.B. das Problem umschiffen, aber ist das so der Sinn?
Irgendwas stimmt doch da nicht. Würde mich freuen, wenn ein geschultes Auge mir da weiterhelfen könnte!