讨论:您将使用哪种设计模式来实现此解决方案?

时间:2017-07-20 07:53:39

标签: oop design-patterns architecture software-design

我想设计具有以下解决方案的软件:

  • 产品具有功能。
  • 每个产品都有以下功能规则:
    • 产品必须具有功能 a,b and d。 _ 产品必须至少包含x个功能列表f,g and m _产品的每个功能都有权重。
  • 在运行时,我想使用外部输入(文件/用户输入)创建产品,并使用规则将功能添加到产品中
  • 我想询问每个产品,鉴于功能它已经被喂食,它有什么分数以及缺少什么。

让我说明最后一点:
让我们说产品 A有关于必须具有a and b功能的规则,必须至少有2个c, d, e and f并且也可以拥有(但不是必须的) )功能g, h ,i and j 我还分配了以下权重a,b each equal 5c, d, e and f each equal 10g, h ,i and j each equal 2.5。 (总共60分)
案例1:
类型a产品 A具有a, c, d, h, j功能。我想要以下报告:
不是A因为缺少b。得分= 0.5((5 + 10 + 10 + 2.5 + 2.5)/ 60)
也可以收到b, e, f, g, i

案例2:
类型b产品 A具有a, b, c, e, h, j功能。我想要以下报告:
A.得分= 0.5833((5 + 5 + 10 + 10 + 2.5 + 2.5)/ 60)
也可以收到d, f, g, i

这是我到目前为止所得到的:

  • ProductsFeatures应由factory创建,以便在运行时生成并遵循相同的界面。

  • 应使用strategy模式生成报告。

你会推荐什么?
谢谢!

3 个答案:

答案 0 :(得分:3)

域模型很有用(我想我根据你的文字做对了):

enter image description here

从那里,我没有看到足够的设计变化(例如,产品A只是Product类的实例,功能a只是Feature类的实例来证明模式的合理性。 IMO,甚至不需要工厂。我错过了你的问题吗?

答案 1 :(得分:1)

据我所知,你有对象运行相同的逻辑(报告,分数和缺失的功能)。但是您为每个对象设置了不同的设置,产品A的设置与产品B的设置不同。

然后我认为您可以检查设计模板模板:https://sourcemaking.com/design_patterns/template_method

它可以帮助您定义产品的不同规则。

答案 2 :(得分:1)

我假设产品会有文字输入,例如情况1的A,a,c,d,h,j。使用静态工厂的产品是很好的方法。使用策略生成报告是不正确的。如果您的策略上下文是产品,那么您是否有一个用例,其中Product-A在运行时更改为Product-B?我觉得不是。 (在不改变状态的情况下使用策略,存在算法族及其可互换性)。此处产品将包含规则和功能的不同组合,因此状态更改(无策略)。我想不需要额外的设计模式。

遵循OO设计将起作用。 Abstract-Product包含在Concrete Product构造函数中填充的规则集合。 Abstract-Product还包含在解析ext数据输入String时填充的功能集合。

功能被建模为枚举,权重为参数。

规则被建模为抽象类,抽象的“布尔检查()”具体规则覆盖。具体规则要求产品访问其特征集合,因此产品与规则是双向关联。

当通过静态工厂从ext输入String配置具体产品时,我们调用generateReport()方法,该方法迭代集合中的所有规则。每个规则应用规则并使用其特定消息(部分)更新违规字符串(如果违反)(例如,缺少特征b等)。 ConcreteProduct中的generateReport()会将报告消息合并到帐户违规消息中。

类似的权重计算方法,因为它仅取决于特征。 所以我猜只有静态工厂才足以作为设计模式。功能可以通过enum.ValueOf()实现。

在这里,我想间接地通过在Rule中使用check()实现generateReport(),在Product Hierarchy和Rule Hirrarchy之间使用Bridge Design模式。