简而言之,回答您的问题:不,不一样。
Decorator 使用现有的 Object 来修改它的行为,但对于外部世界来说,它看起来好像它装饰的类的一个类型。
为了在您的示例中解释这一点,您有一台计算机,并且您的计算机具有一些属性。在您的代码中的某处,您正在创建这台计算机的一个实例。您正在用所有需要的数据填充它。
现在装饰器就位了。您需要一个类来装饰您刚刚创建的计算机的这个实例!正是这个。
我会拿你的电脑并添加一个方法来关闭和打开它
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);
}
如果要使用装饰器,则需要修改行为,否则无用!在您的计算机和监视器示例中,从逻辑角度来看,监视器不能成为计算机的装饰器。对我来说,这是两个不同的对象。
我希望我能让装饰器更清楚一点!