我正在实施战略模式。我已经定义了一个策略作为接口和具体的类来实现这个策略。基于用户选择/配置,算法应用折扣变化。
public interface IStrategy
{
double calculate(double x, double y);
}实施黄金策略的具体类别如下-
public class clsGoldDiscountStrategy : IStrategy
{
public double calculate(double x, double y)
{
return (x * y) * 0.8;
}
}
}实现平台策略的具体类列如下-
public class clsPlatinumDiscountStrategy : IStrategy
{
public double calculate(double x, double y)
{
return (x * y) * 0.7;
}
}要应用的业务逻辑
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);
}
}//主要方法
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();
}发布于 2018-10-01 09:11:16
这些类似乎没有问题,但这种用法毫无意义:
case "GOLD":
//Gold
clsBL blgold = new clsBL(new clsGoldDiscountStrategy());
blgold.costPrice = 5;
blgold.qty = 10;
result = blgold.GetfinalPrice(blgold.costPrice, blgold.qty);
break;此代码(和另一种开关情况)不使用接口IStrategy启用的多态性。相反,您可以简单地将此代码编写为:
case "GOLD":
double GetGoldPrice(double x, double y) => (x * y) * 0.8;
result = GetGoldPrice(5, 10);
break;在这里,所有的类和接口都被删除。只是一种静态的方法。
如果您想使用策略模式,它必须如下所示:
IStrategy strategy = GetStrategy();
strategy.Calculate(...);在这里,GetStrategy()可以返回与该接口兼容的任何对象,而进一步的代码确实取决于任何具体类型。
关于命名,类不必被称为“策略”。我会用IDiscountCalculator和GoldDicountCalculator的名字。或者,而不是“计算器”,你可以使用“模型”或“提供者”。
发布于 2018-10-01 13:29:40
x和y是非常糟糕的参数名称。我必须查看客户端代码才能确定这些代码实际上是cost和quantity。
发布于 2018-10-01 14:06:08
公共双costPrice { get;set;}公共双qty { get;set;}
如果要将这两个值传递给GetfinalPrice,那么使用这两个属性是没有意义的:
公共双GetfinalPrice(双cp,双qty) {返回_strategy.calculate(cp,qty);}
选一个,否则会让人很困惑。
https://codereview.stackexchange.com/questions/204676
复制相似问题