理解:以算法来举例,比如商场的各种促销算法,不管是正常售价,还是打折售价,还是满减,最后都是输出一个收费结果。所以可以建立一个父类,让各种收费算法继承这个父类。(但是,这个子类的构造可以添加参数,根据不同的促销模式,增加不同的参数需求)。利用简单工厂模式加策略模式结合,建立一个分割类,此类构造函数接收客户端的变化,根据变化反馈不同的算法类,此类有一个开放的获取结果的方法,这个方法封装变化,不管是哪一种的促销方式,此方法均同意返回计算结果。
在客户端,只需要认识一个类,而简单工厂模式却是需要客户端认识两个类的。示例如下:
///父类
class Operation
{
public double NumA { get; set; }
public double NumB { get; set; }
public virtual double GetResult()
{
return NumA + NumB;
}
}
///子类继承
class Add:Operation
{
public Add(double a,double b)
{
NumA = a;
NumB = b;
}
public override double GetResult()
{
return NumB + NumA;
}
}
class Dec:Operation
{
public Dec(double a, double b)
{
NumA = a;
NumB = b;
}
public override double GetResult()
{
return NumA-NumB;
}
}
class DIV:Operation
{
public DIV(double a, double b)
{
NumA = a;
NumB = b;
}
public override double GetResult()
{
if (NumB==0)
{
throw new Exception("被除数不能为0");
}
return NumA/NumB;
}
}
class Mul:Operation
{
public Mul(double a, double b)
{
NumA = a;
NumB = b;
}
public override double GetResult()
{
return NumA*NumB;
}
}
class OtherOpration:Operation
{
public OtherOpration(double a,double b,double precent)
{
NumA = a;
NumB = b;
_precent = precent;
}
private double _precent;
public override double GetResult()
{
return (NumA + NumB) * _precent;
}
}
//分割类
class CashContext
{
Operation operation;
public CashContext(string str,double aNum,double bNum)
{
switch (str)
{
case "+":
operation = new Add(aNum,bNum);
break;
case "-":
operation = new Dec(aNum, bNum);
break;
case "*":
operation = new Mul(aNum, bNum);
break;
case "/":
operation = new DIV(aNum, bNum);
break;
case "other":
operation = new OtherOpration(aNum, bNum,0.5);
break;
default:
operation = null;
break;
}
}
public double GetResult()
{
return operation.GetResult();
}
}
class Program
{
static void Main(string[] args)
{
try
{
//客户端只需要认识这个类,简单工厂有可能还需要认识两个类
CashContext operation = new CashContext("other", 3,4);
double ny= operation.GetResult();
Console.WriteLine("获得计算的数值为:"+ny);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("当前计算出现异常:" + ex.Message);
Console.ReadLine();
}
}
}