首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用策略模式进行折扣变更

用策略模式进行折扣变更
EN

Code Review用户
提问于 2018-10-01 06:29:15
回答 3查看 1.2K关注 0票数 5

我正在实施战略模式。我已经定义了一个策略作为接口和具体的类来实现这个策略。基于用户选择/配置,算法应用折扣变化。

代码语言:javascript
复制
  public interface IStrategy
    {
        double calculate(double x, double y);
    }

实施黄金策略的具体类别如下-

代码语言:javascript
复制
public class clsGoldDiscountStrategy : IStrategy
    {
        public double calculate(double x, double y)
        {
            return (x * y) * 0.8;
        }
    }
}

实现平台策略的具体类列如下-

代码语言:javascript
复制
public class clsPlatinumDiscountStrategy : IStrategy
    {
        public double calculate(double x, double y)
        {
            return (x * y) * 0.7;
        }
    }

要应用的业务逻辑

代码语言:javascript
复制
public class clsBL
    {
        public double costPrice { get; set; }
        public double qty { get; set; }
        IStrategy _strategy;

        public clsBL(IStrategy strategy)
        {
            _strategy = strategy;
        }

        public double GetfinalPrice(double cp, double qty)
        {
            return _strategy.calculate(cp, qty); 
        }

    }

//主要方法

代码语言:javascript
复制
static void Main(string[] args)
        {
            Console.WriteLine("Enter the discount Plan (Gold/Platinum)");
            string filter = Console.ReadLine().ToUpper();
            double result = 0;

            if (filter.Length > 0)
            {
                switch (filter)
                {
                    case "GOLD":
                        //Gold 
                        clsBL blgold = new clsBL(new clsGoldDiscountStrategy());
                        blgold.costPrice = 5;
                        blgold.qty = 10;

                        result = blgold.GetfinalPrice(blgold.costPrice, blgold.qty);
                        break;

                    case "PLATINUM":
                        //Platinum
                        clsBL blplatinum = new clsBL(new clsPlatinumDiscountStrategy());
                        blplatinum.costPrice = 10;
                        blplatinum.qty = 8;

                        result = blplatinum.GetfinalPrice(blplatinum.costPrice, blplatinum.qty);
                        break;
                    default:
                        Console.WriteLine("Enter the discount value as either  gold or platinum");
                        break;
                }

                Console.WriteLine("The result for " + filter + " is " + result);

            }
            else
            {
                Console.WriteLine("Enter the discount value");
                return;
            }


            Console.ReadLine();

        }
EN

回答 3

Code Review用户

发布于 2018-10-01 09:11:16

这些类似乎没有问题,但这种用法毫无意义:

代码语言:javascript
复制
                case "GOLD":
                    //Gold 
                    clsBL blgold = new clsBL(new clsGoldDiscountStrategy());
                    blgold.costPrice = 5;
                    blgold.qty = 10;

                    result = blgold.GetfinalPrice(blgold.costPrice, blgold.qty);
                    break;

此代码(和另一种开关情况)不使用接口IStrategy启用的多态性。相反,您可以简单地将此代码编写为:

代码语言:javascript
复制
                case "GOLD":
                    double GetGoldPrice(double x, double y) => (x * y) * 0.8;
                    result = GetGoldPrice(5, 10);
                    break;

在这里,所有的类和接口都被删除。只是一种静态的方法。

如果您想使用策略模式,它必须如下所示:

代码语言:javascript
复制
IStrategy strategy = GetStrategy();
strategy.Calculate(...);

在这里,GetStrategy()可以返回与该接口兼容的任何对象,而进一步的代码确实取决于任何具体类型。

关于命名,类不必被称为“策略”。我会用IDiscountCalculatorGoldDicountCalculator的名字。或者,而不是“计算器”,你可以使用“模型”或“提供者”。

票数 5
EN

Code Review用户

发布于 2018-10-01 13:29:40

xy是非常糟糕的参数名称。我必须查看客户端代码才能确定这些代码实际上是costquantity

票数 5
EN

Code Review用户

发布于 2018-10-01 14:06:08

公共双costPrice { get;set;}公共双qty { get;set;}

如果要将这两个值传递给GetfinalPrice,那么使用这两个属性是没有意义的:

公共双GetfinalPrice(双cp,双qty) {返回_strategy.calculate(cp,qty);}

选一个,否则会让人很困惑。

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

https://codereview.stackexchange.com/questions/204676

复制
相关文章

相似问题

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