3

我正在开发一个可以帮助我提高 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 代表相关产品的系列?有没有比我用过的更好的方法来解决这个问题?

4

2 回答 2

1

如果您愿意,您可以合并抽象工厂模式来处理 TaxPolicy 对象的创建。

在您的情况下,这将涉及:

AbstractTaxPolicyFactory– 带有抽象方法的接口createItemCategoryTaxPolicy()and createImportDutyTaxPolicy(),这将创建抽象的税收政策ItemCategoryTaxPolicyImportDutyTaxPolicy(这些将是您的“相关产品系列”)

USTaxPolicyFactory-ChinaTaxPolicyFactory两个具体工厂,每个都实施这两种方法来创建具体的税收政策,例如ChinaImportDutyTaxPolicy,等等。

ItemCategoryTaxPolicyImportDutyTaxPolicy各自具体税收政策的接口

USItemCategoryTaxPolicy, USImportDutyTaxPolicy, ChinaItemCategoryTaxPolicy, 和ChinaImportDutyTaxPolicy– 四项具体税收政策。例如,在运行时 ,USImportDutyTaxPolicy将由USTaxPolicyFactory, 和ImportDutyTaxPolicy类型创建。

SalesPolicy将是您的客户,将使用抽象工厂和抽象税收政策接口,例如:

AbstractTaxPolicyFactory absFactory = new ChinaTaxPolicyFactory();
// or use a static factory method: 
// TaxPolicyFactoryCreator.createNewFactory(Country.CHINA); 
ItemCategoryTaxPolicy itemCatTaxPolicy = absFactory.createItemCategoryTaxPolicy();
addTaxPolicy(itemCatTaxPolicy);
ImportDutyTaxPolicy importDutyTaxPolicy = absFactory.createImportDutyTaxPolicy();
addTaxPolicy(importDutyTaxPolicy);
于 2012-08-28T17:42:41.443 回答
0

我会使用工厂模式。实现/设计一个工厂类,该类将接受语言环境信息,并将返回一个实现上述行为的类。这些行为的实现会因国家和城市而异,因此工厂必须弄清楚并返回哪个特定类为区域设置提供了正确的实现。

于 2012-08-28T14:35:29.540 回答