我正在开发一个可以帮助我提高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不再是一个类,而是一个带有getTaxPolicies方法的接口,该方法返回TaxPolicy的列表。 USASalesPolicy和ChinaSalesPolicy将实现SalesPolicy,而getTaxPolicies方法将分别返回与特定国家/地区有关的TaxPolicy列表。
同样,每个国家/地区都会有自己的税收计算调整。 USATaxCalculator和ChinaTaxCalculator可以处理独立的实现。
最后,SalesEngine将在构造函数中传递给SalesPolicyFactory和TaxCalculatorFactory,而不是直接传递SalesPolicy和TaxCalcualtor。将向applyPolicies方法传递一个附加参数,该参数将是代表国家/地区的字符串。 applyPolciies方法会将国家/地区传递给SalesEngine中的工厂,并使用它们创建适当的SalesPolicy和TaxCalculator实例,以用于计算税额。
到目前为止,这就是我的思考过程。我是否对定义明确的设计原则和工厂模式表示公正?如何使用抽象工厂模式,使SalesPolicy和TaxCalculator代表相关产品的族?有没有比我以前使用的方法更好的解决问题的方法?
最佳答案
如果愿意,可以合并Abstract Factory模式来处理TaxPolicy对象的创建。
您的情况涉及:AbstractTaxPolicyFactory
–具有抽象方法createItemCategoryTaxPolicy()
和createImportDutyTaxPolicy()
的接口,它将创建抽象税收政策ItemCategoryTaxPolicy
和ImportDutyTaxPolicy
(这些将是您的“相关产品家族”)USTaxPolicyFactory
和ChinaTaxPolicyFactory
–两个具体工厂,每个工厂都执行这两种方法来创建具体的税收政策,例如ChinaImportDutyTaxPolicy
等。ItemCategoryTaxPolicy
和ImportDutyTaxPolicy
–各个具体税收政策的界面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);
关于java - 我可以使用哪种设计模式基于购物车应用程序的国家/州/位置创建对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12160959/