Design patterns 这里可以使用什么设计模式?
我是新的设计模式。 有人能帮我确定这里可以使用哪种设计模式吗? 请同时提供理由Design patterns 这里可以使用什么设计模式?,design-patterns,Design Patterns,我是新的设计模式。 有人能帮我确定这里可以使用哪种设计模式吗? 请同时提供理由 假设我们想要模拟一台个人计算机(PC)。PC由一个机柜组成,机柜包括一个机箱。机箱由总线、软盘驱动器、内存单元、CPU和电源组成。总线包含一个网卡。我们希望以统一的方式处理所有设备部件。所需的基本操作是netPrice和powerconsumpion,它们分别返回每个组件的净价和功耗。此外,每个组件可能有自己的特定语义。我建议的两种主要设计模式是and模式 实现两个接口:NetPrice和powerconsumpio
假设我们想要模拟一台个人计算机(PC)。PC由一个机柜组成,机柜包括一个机箱。机箱由总线、软盘驱动器、内存单元、CPU和电源组成。总线包含一个网卡。我们希望以统一的方式处理所有设备部件。所需的基本操作是netPrice和powerconsumpion,它们分别返回每个组件的净价和功耗。此外,每个组件可能有自己的特定语义。我建议的两种主要设计模式是and模式 实现两个接口:
NetPrice
和powerconsumpion
- 在
中,添加方法NetPrice
getNetPrice
- 在
中,添加方法powerconsumpion
getpowerconsumpion
如果所有的组件都需要这两种方法,请考虑添加一个抽象的代码>组件类型实现这两个接口。从此
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;
}
对具有其他组件的组件执行相同的操作,例如,如果您的总线
具有网卡
,则总线上的getNetPrice
将获得网卡的净价,并将其添加到总线的任何成本中。显然,对于getPowerConsumption
也是如此
没有其他组件的组件(复合树中的叶子)将只返回它们各自的值,例如,您的NetworkCard
将只返回它们各自的值
public double getNetPrice() {
return 42.0;
}
如果要单独打印净价格和功耗,请查看
注意:您没有提到需要使用哪种语言,因此代码示例是伪代码。我假设您将使用某种面向对象的语言来支持接口、抽象之类的东西 您可以使用命令模式隐藏每个设备的规范,只公开您希望机箱使用的方法 为此,您可以创建一个界面,如:
public interface Command {
public void execute();
}
然后,为希望机箱用于每个设备的每个方法创建一个类,例如netPrice():
现在,当您想对HD使用newPrice方法时,例如,您将在构造函数中用HD实例化一个netprice命令,然后使用execute方法exposed
希望有帮助。听起来像是家庭作业。你有自己的想法吗?你能在这里分享它们吗?是的。我认为这是创造性的,因为我们想为pc创建一个新对象,但我怀疑它是否也可以是结构化的,因为它包含一组对象。听起来使用界面是一种方式。。IPCComponent公开了GetNetPrice()和getPowerConsument()方法,这些方法背后的代码在类(组件)之间可以是完全唯一的,您能解释一下为什么不使用命令模式吗?@J.Guilherme您能解释一下为什么您认为它是合适的吗?因为此模式将隐藏每个设备的所有规范,只公开netPrice和功耗,这些将使用以下接口实现:抱歉,我意外按下了enter,顺便说一句:因为命令模式将隐藏每个设备的所有规范,只公开将使用该模式公开的netPrice和功耗。然后,当机箱需要netPrice时,它们将仅使用execute方法,使用以下命令:公共接口命令{public void execute();}公共类NetPriceCommand:Command{private eEquipment;公共NetPriceCommand(Equipment Equipment){this.device=Equipment;}公共无效执行(){这设备.NETPRICE();} @ J.GuelHelMHMM,可能。我发现直觉不那么直观。考虑把它作为答案。我不认为我的解决方案是唯一的解决方案。
public class NetPriceCommand : Command {
private Equipment equipment;
public NetPriceCommand(Equipment equipment) {
this.equipment = equipment;
}
public void execute() {
this.equipment.netPrice();
}
}