这里可以使用什么设计模式?

时间:2016-07-01 07:14:53

标签: design-patterns

我是设计模式的新手。 有人可以帮我确定可以在这里使用哪种设计模式吗? 请提供理由。

假设我们想要建模个人计算机(PC)。 PC由机柜组成,机柜包括机箱。机箱本身由总线,软盘驱动器,存储器单元,CPU和电源组成。总线包含网卡。我们希望以统一的方式处理所有设备组件。所需的基本操作是netPrice和powerConsumption,它们分别返回每个组件的净价和功耗。此外,每个组件可能都有自己的特定语义。

2 个答案:

答案 0 :(得分:3)

我建议的两种主要设计模式是BuilderComposite模式。

实施两个界面:NetPricePowerConsumption

  • 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;
}

对于具有其他组件的组件,例如,如果您的BusNetworkCard,则公交车上的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,然后使用暴露的执行方法。

希望它有所帮助。