我是设计模式的新手。 有人可以帮我确定可以在这里使用哪种设计模式吗? 请提供理由。
假设我们想要建模个人计算机(PC)。 PC由机柜组成,机柜包括机箱。机箱本身由总线,软盘驱动器,存储器单元,CPU和电源组成。总线包含网卡。我们希望以统一的方式处理所有设备组件。所需的基本操作是netPrice和powerConsumption,它们分别返回每个组件的净价和功耗。此外,每个组件可能都有自己的特定语义。
答案 0 :(得分:3)
我建议的两种主要设计模式是Builder和Composite模式。
实施两个界面:NetPrice
和PowerConsumption
。
NetPrice
中添加方法getNetPrice
PowerConsumption
中添加方法getPowerConsumption
如果所有组件都需要这两种方法,请考虑添加实现这两个接口的抽象ComponentType
。从此ComponentType
扩展您的所有其他组件。这将允许您使用自己的特定实现每个子类,通过相同的接口公开。
为了汇总PC
,我建议您查看构建器模式,例如用专门的方法构建一个用于组装计算机的类,例如允许你编写像
PCBuilder builder = new PCBuilder();
PC pc = builder
.cabinet(new Cabinet())
.chassis(new Chassis))
.cpu(new Intel())
.andSoOn()
.assemble();
它'由建造者以适当的方式将事物连接在一起。
我假设您想要获得PC的总净价和功耗,因此它实现了我们在开始时定义的相同的两个接口。这将是一个复合模式,例如, PC会做什么
public double getNetPrice() {
double sum = 0;
foreach (this.components as component) {
sum += component.getNetPrice();
}
return sum;
}
对于具有其他组件的组件,例如,如果您的Bus
有NetworkCard
,则公交车上的getNetPrice
会获得网卡的净价,并将其添加到公交车可能需要的费用中。显然与getPowerConsumption
相同。
没有其他组件的组件(复合树中的树叶)将只返回它们各自的值,例如您的NetworkCard
只会
public double getNetPrice() {
return 42.0;
}
如果您想单独打印净价和功耗,请查看Visitor pattern。
注意:您没有提到您需要哪种语言,因此代码示例是伪代码。我假设您将使用某种面向对象的语言来支持接口和抽象等内容。
答案 1 :(得分:0)
您可以使用命令模式隐藏每个设备的规格,仅显示您希望机箱使用的方法。
为此,您可以创建如下界面:
public interface Command {
public void execute();
}
然后,为每个希望机箱用于每个设备的方法创建一个类,例如netPrice():
public class NetPriceCommand : Command {
private Equipment equipment;
public NetPriceCommand(Equipment equipment) {
this.equipment = equipment;
}
public void execute() {
this.equipment.netPrice();
}
}
现在,当您想为HD使用newPrice方法时,您将在构造函数中使用HD实例化NetPriceCommand,然后使用暴露的执行方法。
希望它有所帮助。