oop - 双向OOP设计模式

标签 oop design-patterns

这是一个一般性问题,让我在特定场景中阐述它。我正在编写一个定价系统。一方面有几个“引擎”,另一方面有几个“仪器”。我为它们创建了类层次结构。

现在我的问题来了,我想实现一个定价机制。给定特定的引擎和特定的工具,它们共同确定计算价格的算法。最好将其编码在 2 条目表中。两个实例都包含重要信息,似乎没有一个比另一个更重要。在 OOP 中,方法属于一个类,因此我认为没有合适的设计来处理这个问题:“定价”方法应该在 Instruments 类中,还是在 Engines 类中?

无论我走哪条路,我都会遇到同样的问题。假设我决定它应该在引擎中。然后,在定价方法中,我应该有一个“if-then-else”指令来处理每个可能的 InstrumentClass?这看起来太丑陋了(而且耦合紧密!),特别是如果我必须用类似的东西来检查它

isinstance(inst, InstrClass1)

我可以想象在许多情况下都会出现类似的情况。处理它们的最佳设计模式是什么?

改写为车辆+电路示例

假设您一方面有一个车辆类层次结构。有摩托车、汽车等特定物体 可能是Yahama Ray,它是摩托车的实例,也是车辆。

另一方面,你有电路。还有 LeMans、Jerez、LagunaSeca 等级别。

我们想要做的是模拟给定车辆在给定电路中的性能。例如,假设 输出是车辆完成一圈所需的时间。对于摩托车和汽车来说,物理原理是不同的, 所以你有不同的算法。但还假设在某些电路中您需要考虑一些因素 在其他方面是无关紧要的。所以,只有当你了解车辆和电路的所有细节时,你才能进行模拟。 您不能要求电路“模拟自身”并获得时间,然后也要求车辆“模拟自身”并给出时间 下次再和他们一起做出最终的答案。

希望这能让我明白我正在尝试做的事情。

最佳答案

是否有可能有一个 CalculatorService,它有一个接受引擎和仪器的方法。它可以包含合并发动机价格和仪器价格的逻辑。单独的价格将来自引擎和仪器对象,因此封装不会被破坏。

class CalculatorService {
   public BigDecimal calculatePrice(Instrument instrument, Engine engine) {
    def instrumentPrice = instrument.calculatePrice()
    def enginePrice = engine.calculatePrice() 
    //algorithm to consolidate both prices.
   return consolidatedPrice
  }
}

关于oop - 双向OOP设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40258323/

相关文章:

java - 关于使用断言删除生产中 Java 代码部分的建议

c# - 构造函数 + 依赖注入(inject)

javascript - 我可以拥有与 javascript 中的类同名的对象吗?

javascript - 从类构造函数继承 javascript

c++ - 类似单例的管理类,更好的设计吗?

c# - 哪种软件设计模式最适合以下场景 (C#)

c++ - 来自 "Designed Patterns Explained"的桥接模式示例

c++ - 覆盖现有类的运算符

java - 关于spring容器热切单例设计模式

php - 如何在php/mysql中高效加载相关对象?