策略修改简单工厂结合并使用反射技术进行优化

不理解这篇可以先看上篇“策略模式和简单工厂的合用”
简单工厂解决对象的创建问题,如果工厂中包含很多的规则,如果在不同的时刻需要改变规则,代码就需要从新编译部署,这时候就用到策略模式。

策略模式的应用场景再次介绍:
策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只需要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。具体的可以看这篇博客

但是在实例化不同的对象时对象的类型是写死的,有没有更好的方法呢?这时候就需要用到反射,它将程序由编译时转为运行时。

废话不多说直接上代码,还是以商品打折为例:


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));
        }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页