java - 我可以使用什么设计模式来根据国家/州/位置为购物车应用程序创建对象?

标签 java design-patterns shopping-cart factory-pattern

我正在开发一个可以帮助我提高 OO 设计技能的应用程序。我几乎完成了作业,但我觉得我需要让我的应用程序更具可扩展性,并且需要一些关于如何实现这一目标的意见。

问题域可以概括如下:

问题域是设计购物车应用程序。食品、书籍等元素有不同的类别。元素适用的税率取决于元素的类别。有明确的税收政策,例如 10% 的基本税适用于除属于食品类别的项目外的所有项目,所有进口项目均需缴纳 5% 的附加进口关税。

我想重点关注的领域是负责确定某个项目是否符合给定税收政策的模块。我利用其他人和互联网的想法为税收模块提出了以下设计:

Design for shopping cart tax module

TaxCriteria: 定义项目必须满足的条件才能符合 TaxPolicy 的条件。具体的实现者实现 isEligible 方法并提供业务逻辑来确定一个项目是否符合政策的条件,例如。 ImportedTaxCriteria 中的 isEligible 方法将检查某个项目是否已导入。

TaxPolicy: 有一个 TaxCriteria、适用的税率和税收政策的名称。 TaxPolicy 和 TaxCriteria 之间的关系基于规范模式。

SalesPolicy : 由一个或多个 TaxPolicy 实例组成。

SalesEngine:SalesEngine 有一个 SalesPolicy 和一个 TaxCalculator。向 applyPolicies 方法传递一个包含项目列表的订单。 applyPolicies 将遍历订单中的每个项目,并根据销售政策中的每个 TaxPolicy 检查其资格,并根据适用的政策使用 TaxCalculator 计算税收。

新问题域:

每个国家/地区都有不同的销售政策。美国的进口关税可能为 5%,而中国的进口关税可能为 3%。为了满足这个要求,我正在考虑使用简单的工厂模式。 SalesPolicy 将不再是一个类,而是一个具有返回 TaxPolicy 列表的 getTaxPolicies 方法的接口(interface)。 USASalesPolicy 和 ChinaSalesPolicy 将实现 SalesPolicy,getTaxPolicies 方法将分别返回属于特定国家/地区的 TaxPolicy 列表。 同样,每个国家都会有自己的税收计算调整。 USATaxCalculator 和 ChinaTaxCalculator 可以处理独立的实现。

最后,SalesEngine 将在构造函数中传递 SalesPolicyFactory 和 TaxCalculatorFactory,而不是直接传递 SalesPolicy 和 TaxCalcualtor。 applyPolicies 方法将传递一个附加参数,该参数将是表示国家/地区的字符串。 applyPolciies 方法会将国家/地区传递给 SalesEngine 中的工厂,并使用它们创建适当的 SalesPolicy 和 TaxCalculator 实例以用于计算税收。

到目前为止,这就是我的思考过程。我是否公正地对待定义明确的设计原则和工厂模式?如何使用抽象工厂模式使 SalesPolicy 和 TaxCalculator 代表相关产品系列?有没有比我用过的更好的方法来解决问题?

最佳答案

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

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

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

USTaxPolicyFactoryChinaTaxPolicyFactory – 两个具体的工厂,每个都实现这两个方法来创建具体的税收政策,如 ChinaImportDutyTaxPolicy 等。

ItemCategoryTaxPolicyImportDutyTaxPolicy – 各自具体税收政策的接口(interface)

USItemCategoryTaxPolicyUSImportDutyTaxPolicyChinaItemCategoryTaxPolicyChinaImportDutyTaxPolicy – 四种具体的税收政策。例如,在运行时 USImportDutyTaxPolicy 将由 USTaxPolicyFactory 创建,并且属于 ImportDutyTaxPolicy 类型。

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

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/

相关文章:

c# - 如何使用另一个类中的方法添加到 ListBox?

Laravel:构建 Controller 时契约(Contract)文件不可实例化

java - 没有类型转换器可用于从类型 : <<pojo>> to the required type: java. io.InputStream 转换为值

java - 更新 JTextArea 后 JButton 改变位置

JAVA添加总计

python - 是否有传播错误和警告详细信息的模式?

java - 读取 java jar 命令控制台输出

c# - 如何抽象一个单例类?

在构造函数中使用 "this"的 Java 双向对象引用

asp.net - 如何在 ASPDotNetStoreFront 中为产品添加子产品?