簡要回答你的問題:不,它是不一樣的。
裝飾器使用現有的對象來修改它的行爲,但對於外部世界來說,它看起來好像它裝飾類的類型在哪裏。
要解釋這個在你的例子中你有一臺計算機和您的計算機有一些屬性。您的代碼中的某處您正在創建此計算機的一個實例。您正在填寫所有需要的數據。
現在來裝飾器到位。你需要一個類來裝飾你剛創建的計算機的這個實例!恰恰是這一個。
我會接受你的計算機,並添加一個方法將其關閉並
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);
}
如果你想使用一個裝飾你需要修改的行爲,否則它是沒用的! 在你的計算機和顯示器從邏輯點的例子中,監視器不能是計算機的裝飾器。對我來說,這是兩個不同的對象。
我希望我能讓它更清楚一點裝飾者是什麼!
來源
2012-04-04 08:16:55
Adi
如何在我的例子中,我刪除裝飾類,然後顯示器沒有從計算機類繼承,而是我只是把計算機類的實例內監視類然後做同樣的事情。 – user1293258 2012-04-04 07:53:35