首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >折扣计算模式

折扣计算模式
EN

Software Engineering用户
提问于 2020-08-17 10:56:30
回答 1查看 1K关注 0票数 0

我正在实施折扣计算模型。我确实有一个 <#>One 类:

代码语言:javascript
复制
public class Product
{
    public string Name { get; set; }
    public Size Size { get; set; }
    public decimal Price { get; set; }
}

我也有一个订单类:

代码语言:javascript
复制
public class Order
{
    public DateTime Date { get; set; }
    public string ProductName { get; set; }
    public Size Size { get; set; }
}

我有一些折扣:

  1. 有竞争力的折扣-在所有产品中按尺寸选择最低价格。例如,如果Latte S大小为2美元,而Expresso S大小为3美元,则Expresso <#>Expresso大小将花费2美元,则适用1美元折扣。
  2. 数量折扣-对于x金额一是免费的时间。例如,我购买2x 拿铁,而第三是免费的,这个折扣只能应用于每日

在我的实现过程中,我想使用策略模式,但我没有多少细微之处:

  1. 竞争性折扣不依赖于时间段,而在于数量折扣。
  2. 数量折扣取决于所选择的数量,竞争性不是(但是我可以在实现中提供1的价值,因此它将适用于每一项)。

解决方案:

IDiscount.cs

代码语言:javascript
复制
public interface IDiscount
{
    public bool IsApplicable(Order order, int itemsCountForDiscount);
    public decimal GetDiscountAmount(Order order);
}

竞争折扣

代码语言:javascript
复制
public class CompetiveDiscount : IDiscount
{
    Size Size { get; set; }
    decimal LowestProductPrice { get; set; }
    public CompetiveDiscount(Size size)
    {
        Size = size;
        LowestProductPrice = GetLowestProductPriceBySize(size);
    }

    public decimal GetDiscountAmount(Product product)
    {
        return product.Price - LowestPriceProvider;
    }

    public bool IsApplicable(Product product, int itemsCountForDiscount)
    {
        //returns if applicable
    }

    private decimal GetLowestProductPriceBySize(Size size)
    {
        //returns lowest price of products
    }
}

数量折扣数

代码语言:javascript
复制
public class QuantityDiscount: IDiscount
{
    string ProductName { get; set; }
    int ItemsCountForDiscount { get; set; }
    Period Period { get; set; } //enum for period

    public QuantityDiscount(string productName, int itemsCountForDiscount, Period period)
    {
        ProductName = productName;
        ItemsCountForDiscount = itemsCountForDiscount;
        Period = period;
    }

    public decimal GetDiscountAmount(Product product)
    {
        return product.Price;
    }

    public bool IsApplicable(Product product, int itemsCountForDiscount)
    {
        //returns if applicable
    }
}

我的问题是,如果我确实需要在一个折扣中使用Date,那么我如何才能使这个模型工作,但在另一个折扣中,我不需要。使用连锁责任设计模式更好吗?

EN

回答 1

Software Engineering用户

发布于 2020-08-17 18:17:08

策略模式的目的是封装一系列算法,并可互换地使用它们。但你现在的需求似乎完全不同:

  • 你想要应用不同的算法,不能互换使用;
  • 你想要使用正确的算法;
  • 也许你甚至想要合成算法,并应用竞争性和数量折扣。

但是,如果您仍然希望使用“策略”,则必须提供对计算数据的统一访问:

  • 为此,可以添加所有可能的参数。但考虑到ISP和未来的发展,这并不是一个好主意。
  • 因此,更好的选择是向参数中注入一个查询对象,该对象允许访问当前订单和其他订单。直到你的策略使用同一天。

另一种办法是采用类似的方法,而是使用责任链。链中的每个折扣计算器都会发现它是否适用,如果需要,请调用下一个计算器。

但是如果我在你的地方,我不会专注于这个问题的设计模式。我会选择一个临时的打印引擎,你可以在其中添加规则,然后让引擎去找哪些规则适用,如何解决竞争规则之间的冲突,计算适用的折扣,并将它们结合起来。一旦您设计了这个引擎,您就可以开始考虑根据实际的设计问题来重构它,而不是过早的选择。

Not相关的:在ERP上做了很多工作,我可以告诉您,折扣计算非常复杂,很少符合一个简单的模式,而且您的两种情况只触及销售人员所能发明的表面。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/414913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档