Um Ihre Frage kurz zu beantworten: Nein, es ist nicht das Gleiche.
Ein Decorator verwendet ein vorhandenes Objekt, um das Verhalten zu ändern, aber für die Außenwelt sieht es so aus, als wäre es ein Typ der Klasse, die es schmückt.
Um dies in Ihrem Beispiel zu erklären, haben Sie einen Computer und Ihr Computer hat einige Eigenschaften. Irgendwo in Ihrem Code erstellen Sie eine Instanz dieses Computers. Sie füllen es mit allen benötigten Daten.
Jetzt kommt der Decorator an Ort und Stelle. Sie benötigen eine Klasse, die diese Instanz des gerade erstellten Computers schmückt! Genau dieser.
Ich werde Ihren Computer übernehmen und eine Methode hinzufügen, um sie auszuschalten und auf
public class Computer {
private boolean isOn = true;
private String description = "Computer";
public vod turnOn(){
this.isOn=true;
}
public void turnOff(){
this.isOn = false;
}
public void setDescription(String description){
this.description = description;
}
public String Description(){
return this.description;
}
}
Jetzt ein Dekorateur erschaffe ich, wo Sie Ihren Computer nicht ausschalten.
public class ComputerDecorator1 extends Computer {
private Computer computer;
public ComputerDecorator1(Computer computer){
this.computer = computer;
}
public vod turnOn(){
this.computer.turnOn();
}
public void turnOff(){
System.out.println("You cannot turn me off!!!!");
}
public void setDescription(String description){
this.computer.setDescrition(descritption);
}
public String Description(){
return this.computer.Description();
}
}
Wie Sie sehen können, müssen Sie ihm eine Computerinstanz im Konstruktor geben. Dies ist der Computer, den wir dekorieren. Jeder Methodenaufruf wird an diese Klasse weitergegeben. Normalerweise müssen Sie alle Methoden überschreiben und an das dekorierte Objekt übergeben. In diesem Fall der Computer.
Sie können dies verwenden, um das Verhalten eines Objekts zu ändern, ohne eine neue Klasse davon zu erstellen. Der Vorteil ist, dass wenn Sie eine Instanz eines Computers von woanders bekommen, Sie diesen Filter hinzufügen können, so dass der Rest Ihres Programms es nicht ausschalten kann. Diese
ist, wie Sie ein Dekorateur in Ihrem Programm verwenden:
public void getMyComputerAndTurnItOff(){
Computer myComputer = getMyComputer();
myComputer.turnOff();
}
public Computer getMyComputer(){
//Here you will load a Computer from an other class
Computer computer = this.otherClass.loadComputerFromDB();
//Now we could return it, but what if you shouldn't be able to turn it off?
//easy add our decorator
return new ComputerDecorator1(computer);
}
Wenn Sie einen Ausstatter verwenden möchten, müssen Sie das Verhalten ändern, sonst ist es sinnlos ist! In Ihrem Beispiel mit Computer und Monitor von einem logischen Punkt aus kann ein Monitor kein Dekorator für einen Computer sein. Für mich sind das zwei verschiedene Objekte.
Ich hoffe, ich könnte es ein bisschen klarer machen, was ein Dekorateur ist!
Wie in meinem Beispiel, ich entferne die Dekorator-Klasse dann Monitor nicht von der Computerklasse geerbt, stattdessen ich nur Instanz der Computer-Klasse innerhalb der Monitor-Klasse dann tun Sie das gleiche. – user1293258