あなたの質問に簡単に答えるには:いいえ、それは同じではありません。
Aデコレータはそれをbehauviourを修正するために、既存のオブジェクトを使用していますが、外の世界のためにそれがあるかのように見えるところ、それは飾るクラスのTYP。
この例を説明するには、コンピュータがあり、コンピュータにはいくつかのプロパティがあります。コードのどこかで、このコンピュータのインスタンスを作成しています。必要なすべてのデータを入力します。
今すぐデコレータが設置されます。作成したばかりのコンピュータのこのインスタンスをデコレートするクラスが必要です。まさにこれ。
私はあなたのコンピュータを取ると、それをオフにする方法を追加し、
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();
}
}
ご覧のとおり、コンピュータインスタンスをコンストラクタに渡す必要があります。これは私たちが飾っているコンピュータです。すべてのメソッド呼び出しがこのクラスに渡されます。 通常、すべてのメソッドをデコレートされたオブジェクトに渡すメソッドを上書きする必要があります。この場合、コンピュータ。
これを使用して、オブジェクトの動作を変更し、新しいクラスを作成することができます。 利点は、他の場所からコンピュータのインスタンスを取得したときにこのフィルタを追加できるため、他のプログラマがこのフィルタをオフにできないことです。
これは、あなたのプログラムにデコレータを使用する方法である:
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つの異なるオブジェクトです。
デコレータが何であるかを少しはっきりと分かりやすくしたいと思っています。
出典
2012-04-04 08:16:55
Adi
私の例では、デコレータクラスを削除し、コンピュータクラスから継承していないモニタクラスをインスタンスに入れ、モニタクラス内にコンピュータクラスのインスタンスを配置します。 – user1293258