Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 这里可以使用什么设计模式?_Design Patterns - Fatal编程技术网

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();
    }
}