質問に簡単に答えると: いいえ、同じではありません。
デコレーターは、既存のオブジェクトを使用してその動作を変更しますが、外の世界では、それが装飾するクラスの典型であるかのように見えます。
あなたの例でこれを説明するために、コンピューターがあり、コンピューターにはいくつかのプロパティがあります。コードのどこかで、このコンピューターのインスタンスを作成しています。必要なすべてのデータを入力しています。
これで、Decorator が配置されます。作成したコンピュータのこのインスタンスを装飾するクラスが必要です! まさにこれ。
私はあなたのコンピュータを取り、それをオン/オフする方法を追加します
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;
}
}
現在、コンピューターの電源を切ることができないデコレーターを作成しています。
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();
}
}
ご覧のとおり、コンストラクターで彼に Computer インスタンスを与える必要があります。これが私たちが飾っているコンピュータです。すべてのメソッド呼び出しは、このクラスに渡されます。通常、すべてのメソッドを上書きして、装飾されたオブジェクトに渡す必要があります。この場合、コンピュータ。
これを使用して、新しいクラスを作成することなく、オブジェクトの動作を変更できます。利点は、別の場所からコンピューターのインスタンスを取得するときに、このフィルターを追加できるため、プログラムの残りの部分がそれをオフにできないことです。
これは、プログラムでデコレーターを使用する方法です。
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);
}
デコレータを使用したい場合は、動作を変更する必要があります。そうしないと役に立ちません! 論理的なポイントからのコンピューターとモニターの例では、モニターはコンピューターのデコレーターになることはできません。私にとって、これらは 2 つの異なるオブジェクトです。
デコレータとは何かをもう少し明確にしていただければ幸いです。