Dekorator Muster - Irgendwas stimmt hier doch nicht?

BluePrint

Neues Mitglied
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:
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!
 
Mir kommt dein Code etwas wirr vor. Liegt bestimmt an mir, ich habe vom Programmieren so gar keine Ahnung (bin fachfremd hier), aber ich sehe nicht wo du etwas "dekorierst". Die Methode getPrice in deiner ChildSeat-Klasse:

Code:
    @Override
    public float getPrice() {
        return this.price;
    }

Aber vielelicht willst du sowas:

Java:
public abstract class Equipment{
    abstract public double getPrice();
}


public class ChildrenSeat extends Equipment{
    Equipment allEquipment;
    double myPrice;
   
   @Override
    public double getPrice(){
        return allEquipment.getPrice() + myPrice;
    }
}

public class UselessFancyFeature extends Equipment{
    Equipment allEquipment;
    double myPrice;
    
   @Override
    public double getPrice(){
        return allEquipment.getPrice() + myPrice;
    }
}
 
Java:
private boolean allWheelDrive;

    public BMW(Resource childSeat, Resource setTopBox, boolean allWheelDrive, float price, int seats) {
        super(childSeat, setTopBox, seats, price);
 
        // hier solltest du dein allWheelDrive auch in der Instanzvariablen speichern
              this.allWheelDrive = allWheelDrive;
      // denn das willst du in deinen isSelected auch benutzen


     
    }
 
Zuletzt bearbeitet:

Zurück
Oben