不理解这篇可以先看上篇“策略模式和简单工厂的合用”
简单工厂解决对象的创建问题,如果工厂中包含很多的规则,如果在不同的时刻需要改变规则,代码就需要从新编译部署,这时候就用到策略模式。
策略模式的应用场景再次介绍:
策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只需要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。具体的可以看这篇博客。
但是在实例化不同的对象时对象的类型是写死的,有没有更好的方法呢?这时候就需要用到反射,它将程序由编译时转为运行时。
废话不多说直接上代码,还是以商品打折为例:
namespace SampleFactoryandStrategyFactory
{
abstract class CashSuper
{
public abstract double acceptCash(double money);
}
//具体的算法策略
class CashNormal: CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
class CashRebate:CashSuper
{
private double moneyRebate=1d;
public CashRebate(string moneyRebate1)
{
moneyRebate = double.Parse(moneyRebate1);
}
public override double acceptCash(double money)
{
return money * moneyRebate;
}
}
//策略模式 ,定义一系列的算法方法
class CashContext
{
private CashSuper cs;//声明一个cashsuper对象
public CashContext(CashSuper cashsuper)//通过构造函数传入具体的收费策略
{
cs = cashsuper;
}
public CashContext(string type)
{
cs=(CashSuper)Assembly.Load("SampleFactoryandStrategyFactory").CreateInstance("SampleFactoryandStrategyFactory."+ type);//利用反射去除
}
public double GetResult(double money)
{
return cs.acceptCash(money);
}
}
}
static void Main(string[] args)
{
//利用反射修改策略模式
CashContext cst2 = new CashContext("CashNormal");
Console.WriteLine(cst2.GetResult(90));
}