【发布时间】:2018-09-21 17:27:44
【问题描述】:
我正在学习有关设计模式的更多信息,并且我正在尝试实现装饰器模式。我想扩展一个计算机对象以在每个新组件的描述末尾添加一个字符串。这是 Unity/C# 改编自 Design Patterns For Dummies 一书中的 java 示例。
public class Computer {
public Computer(){}
public string Description(){
return "Computer";
}
}
这是每个组件将从中继承的装饰器组件:
public abstract class ComponentDecorator : Computer {
new public abstract string Description();
}
这里有两个组件类 Monitor 和 Disk 可以装饰计算机类。
public class Monitor : ComponentDecorator {
Computer computer;
public Monitor(Computer c){
this.computer = c;
}
public override string Description(){
return computer.Description () + " and a Monitor";
}
}
public class Disk : ComponentDecorator {
Computer computer;
public Disk(Computer c){
this.computer = c;
}
public override string Description(){
return computer.Description () + " and a Disk";
}
}
下面是Start方法:
void Start(){
Computer computer = new Computer ();
computer = new Disk (computer);
computer = new Monitor (computer);
print("You have a " + computer.Description () + ".");
}
我的预期输出是:“您有一台计算机、一个监视器和一个磁盘。”
实际输出是:“你有一台电脑。”
计算机现在不应该像调用 Monitor 描述方法一样调用描述方法吗?如何修改它以获得预期的输出?
【问题讨论】:
-
您的
ComponentDecorator完全错误 - 最值得注意的是,您必须使用new才能重新添加Description的抽象版本。编译器警告您添加new会导致您在此处报告的问题。 -
new不会连接对象,它会创建新对象并替换现有对象。 -
在你的例子中你也必须装饰两次。恕我直言,装饰器模式可能不是您提供的任务的最佳解决方案。