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!
 

White_Fox

Top Contributor
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;
    }
}
 

Jw456

Top Contributor
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:
Ähnliche Java Themen
  Titel Forum Antworten Datum
pindakaas Compiler geht nicht (Dekorator Muster) Java Basics - Anfänger-Themen 18
S Dekorator-Pattern Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
1 Wie dieses Muster am einfachsten erkennen? Java Basics - Anfänger-Themen 32
H Muster mit verschachtelten Schleifen kreieren. Java Basics - Anfänger-Themen 2
Yasemin bahar Muster erkennen Java Basics - Anfänger-Themen 13
C Erste Schritte Muster ausgeben in der Konsole - großes V Java Basics - Anfänger-Themen 5
U Muster in einem Array erkennen Java Basics - Anfänger-Themen 8
F Quadrat Mit Muster Java Basics - Anfänger-Themen 15
J Muster und Schleifen Java Basics - Anfänger-Themen 33
R 2D Arrays mit vorgegebenem Muster Java Basics - Anfänger-Themen 2
E Arrays nach best Muster füllen Java Basics - Anfänger-Themen 4
K String nach bestimmtem Muster parsen Java Basics - Anfänger-Themen 3
P Sägezahn Muster Programm Java Basics - Anfänger-Themen 2
C Array Muster erzeugen Java Basics - Anfänger-Themen 2
J Erste Schritte zweidimensionales Array Muster befüllen. Java Basics - Anfänger-Themen 4
J Strukturierung mit MVC Muster Java Basics - Anfänger-Themen 20
J Array Muster mit true und false Java Basics - Anfänger-Themen 6
C Muster programmieren Java Basics - Anfänger-Themen 4
C Muster programmieren Java Basics - Anfänger-Themen 4
E Muster auf der Konsole ausgeben lassen (Schleifen) Java Basics - Anfänger-Themen 7
arti28 Erste Schritte For-Schleifen und While-Schleifen, String als Muster ausgeben. Java Basics - Anfänger-Themen 3
L Java Muster Java Basics - Anfänger-Themen 1
Todesbote String auf Muster überprüfen Java Basics - Anfänger-Themen 19
C Array Zickzack Muster Java Basics - Anfänger-Themen 3
P RegEx Muster mehrfach treffen Java Basics - Anfänger-Themen 2
M Muster erkennen. Idee: Fassade. Java Basics - Anfänger-Themen 3
Dit_ Regex | Muster {a}{b}{c} Java Basics - Anfänger-Themen 7
M Datentypen Strings nach Muster auslesen und verarbeiten Java Basics - Anfänger-Themen 5
S X Zeichnen als Muster ausgeben Java Basics - Anfänger-Themen 5
R Muster ausgeben Java Basics - Anfänger-Themen 4
H Muster ausgeben Java Basics - Anfänger-Themen 25
G String auf Muster prüfen Java Basics - Anfänger-Themen 5
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S OOP Warum gleiche Instanz der Klasse? (Factory-Muster) Java Basics - Anfänger-Themen 13
L Sägezahn Muster Java Basics - Anfänger-Themen 4
C Muster mit Zweidimensionalen Arrays Java Basics - Anfänger-Themen 18
0 Applet mit folgendem Muster erstellen Java Basics - Anfänger-Themen 12
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
Z Muster Java Basics - Anfänger-Themen 9
J nach Muster in String suchen Java Basics - Anfänger-Themen 4
P Cäsear verschlüsselung irgendwas passt noch nicht Java Basics - Anfänger-Themen 2
L Ist an diesem Befehl irgendwas falsch? Java Basics - Anfänger-Themen 2
L AES - Irgendwas falsch? Java Basics - Anfänger-Themen 0
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
I Properties oder Umgebungsvariablen mit ${irgendwas} lesen? Java Basics - Anfänger-Themen 2
Z Irgendwas stimmt da nicht :/ Java Basics - Anfänger-Themen 4
S will instanz einer Klasse erzeugen - mach irgendwas falsch Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben