我正在开发一个可以帮助我提高 OO 设计技能的应用程序。我几乎完成了任务,但我觉得我需要使我的应用程序更具可扩展性,并且需要一些关于如何实现这一点的输入。
问题域可以简单描述如下:
问题域是设计一个购物车应用程序。食品、书籍等物品有不同的类别。物品符合条件的税率取决于物品的类别。有明确的税收政策,例如10%的基本税适用于除属于食品类别的项目外的所有项目,所有进口项目均需缴纳5%的额外进口关税。
我要关注的领域是负责决定某个项目是否符合给定税收政策的模块。我利用其他人和互联网的想法为税收模块提出了以下设计:
TaxCriteria :定义项目必须满足的条件才能符合 TaxPolicy 的条件。具体实现者实现 isEligible 方法并提供用于确定项目是否符合策略的业务逻辑,例如。ImportedTaxCriteria 中的 isEligible 方法将检查项目是否已导入。
TaxPolicy : 具有 TaxCriteria、适用税的税率以及税收政策的名称。TaxPolicy 和 TaxCriteria 之间的关系基于规范模式。
SalesPolicy :由一个或多个 TaxPolicy 实例组成。
SalesEngine : SalesEngine 有一个 SalesPolicy 和一个 TaxCalculator。向 applyPolicies 方法传递一个包含项目列表的 Order。applyPolicies 将遍历订单中的每个项目,并根据销售政策中的每个 TaxPolicy 检查其资格,并使用基于适用政策的 TaxCalculator 计算税款。
新的问题域:
每个国家都有不同的销售政策。美国的进口关税可能是 5%,而中国的进口关税可能是 3%。为了满足这个要求,我正在考虑使用一个简单的工厂模式。SalesPolicy 将不再是一个类,而是一个带有返回 TaxPolicy 列表的 getTaxPolicies 方法的接口。USASalesPolicy 和 ChinaSalesPolicy 将实现 SalesPolicy,getTaxPolicies 方法将分别返回与特定国家有关的 TaxPolicy 列表。同样,每个国家都会有自己的税收计算调整。USATaxCalculator 和 ChinaTaxCalculator 可以处理独立的实现。
最后,SalesEngine 将在构造函数中传递一个 SalesPolicyFactory 和一个 TaxCalculatorFactory,而不是直接传递一个 SalesPolicy 和一个 TaxCalcualtor。applyPolicies 方法将传递一个附加参数,该参数将是一个代表国家/地区的字符串。applyPolciies 方法会将国家/地区传递给 SalesEngine 中的工厂,并使用它们创建适当的 SalesPolicy 和 TaxCalculator 实例以用于计算税款。
这就是我迄今为止的思考过程。我是否对定义明确的设计原则和工厂模式公正?如何使用抽象工厂模式,使 SalesPolicy 和 TaxCalculator 代表相关产品的系列?有没有比我用过的更好的方法来解决这个问题?