如何在以下示例中优雅地解耦两个类?

时间:2017-08-14 20:10:23

标签: oop design-patterns

假设我们采用使用OOP原则构建自动售货机的情况。

让我们假设我们有一个名为VendingMachine的抽象。

class VendingMachine {
    List<Slot> slots; //or perhaps a 2-d matrix of slots
}

VendingMachine类有一个插槽列表,每个插槽可能有一些容量(模型说5个项目一个接一个)。

现在如何将值($)与插槽相关联。显然,每个插槽都有相同的项目,因此每个插槽应该与相同的值相关联(或者更好的是表示项目的抽象,比如Item类)。

但就责任而言,VendingMachine类应该只能弹出一个项目,或者在尝试从空槽中弹出项目时抛出异常。我认为VendingMachine类不负责知道特定插槽的价值是什么。

如何优雅地设计?是否有一些设计模式出现在你的脑海中。

我的解决方案是创建一个MoneyManager类。

class MoneyManager {
    MoneyManager(VendingMachine vm);
    Pair<Slot, Item> mapping;
}
class Item {
    int itemCode;
    BigDecimal value;
}

即使你认为建模是错误的,我更感兴趣的是你如何解耦这样的2个类。

例如,如果您设计一个停车场,一类车辆应该有关于它需要多少空间(点数)的信息。 ParkingLot有关于它有多少景点的信息。

但我不想让汽车知道它停在哪个停车场以及哪个地方。同样,我也不希望ParkingLot保持停放汽车的状态和位置。是否应该有一个中间类ParkingManager来保持这种状态以实现干净的设计?

1 个答案:

答案 0 :(得分:0)

我认为你需要的是某种逻辑,比如 wharehouse administration

假设所有的插槽和物品都有相同的尺寸,你可能会像这样破坏它。

public class Item
{
    public string Name { get; set; }

    public string Category { get; set; }
}

public class Slot
{
    public int Capacity { get; set; }

    public List<Item> Items { get; set; }
}

public class Warehouse
{
    public List<Slot> Slots { get; set; }
}

这将管理仓库中项目的基本分布Warehouse类将管理插槽列表,Slot类将管理它包含的项目列表。

或许,如果您需要,可以添加尺寸和位置,并添加适合不同广告位的项目的逻辑。