• 设计模式之-策略模式
  • 发布于 1个月前
  • 41 热度
    1 评论

设计模式被称之为程序开发,系统设计,代码优化必备之良品,老少咸宜!那究竟什么是设计模式呢?其实设计模式就是在面向对象语言开发过程中,遇到的种种场景和问题,提出的解决方案和思路,沉淀下来就是设计模式了!其实设计模式也就是套路,解决问题的套路。我们学习设计模式,就是为了站在前辈的肩膀上,能更快更友好的解决程序设计和优化!

什么是策略模式
  
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。下面来一个简单的计算器的例子,通过两大要素来展示:
 
第一,业务逻辑的封装转移,将暴露在上端的业务逻辑封装屏蔽

 AbstractCalculation calculation = null;
                    switch (operate)//封装,继承-抽象  多态
                    {
                        case"+":
                            calculation = new Plus();
                            break;
                        case"-":
                            calculation = new Minus();
                            break;
                        case"*":
                            calculation = new Mutiply();
                            break;
                        case"/":
                            calculation = new Devision();
                            break;
                        default:
                            Console.WriteLine("输入符号异常,重新输入");
                            continue;
                    }

第二,Context上下文来封装转移算法的调用逻辑
publicclassContext
    {
        privateint _iInputLeft = 0;
        privateint _iInputRight = 0;
        private AbstractCalculation _Calculation = null;
        public Context(int iInputLeft, int iInputRight, AbstractCalculation calculation)
        {
            this._iInputLeft = iInputLeft;
            this._iInputRight = iInputRight;
            this._Calculation = calculation;
        }
        publicint Invoke()
        {
            returnthis._Calculation.Calculation(this._iInputLeft, this._iInputRight);
        }
}

两者叠加起来,可以解决算法的规范化使用以及算法调用的复杂度问题!
但是显然也遗留了个问题,对具体算法的依赖和选择算法,直白的说,就是switch+new对象。
在这里,我要给大家纠正一个观点,没有设计模式是完美无缺,是万能的!一个具体的模式在解决一类问题的时候,会带来另外的问题!作为开发者,使用设计模式,就应该扬长避短,具体问题用对应的设计模式解决,比如现在是对象创建的问题,那么就用工厂来解决,所以今天要来一个行为型+创建型模式的融合应用!
 
增加工厂来转移对象的创建问题:
publicstaticAbstractCalculation CreateCalculation(string operate)
        {
            AbstractCalculation calculation = null;
            switch (operate)
            {
                case"+":
                    calculation = new Plus();
                    break;
                case"-":
                    calculation = new Minus();
                    break;
                case"*":
                    calculation = new Mutiply();
                    break;
                case"/":
                    calculation = new Devision();
                    break;
                default:
                    Console.WriteLine("输入符号异常,重新输入");
                    thrownew Exception("输入符号异常,重新输入");
            }
            return calculation;
}

当然,这样的工厂还不够,依赖依旧存在,在C#里面,又想创建对象,又想不依赖细节,那只能是配置文件+反射了
publicstatic AbstractCalculationCreateCalculationReflection(string operate)
        {
            AbstractCalculation calculation = null;
            string key = $"Calculation_{operate}";
            string dllType = ConfigurationManager.AppSettings[key];
            Assembly assembly =Assembly.Load(dllType.Split(',')[1]);
            Type type =assembly.GetType(dllType.Split(',')[0]);
            calculation =(AbstractCalculation)Activator.CreateInstance(type);
            return calculation;
        }

到这里,我们的项目结构变成了以下的样子:
客户端只需要接受输入,完成验证,然后调用对应的服务即可;
算法的调用由Context完成,支持扩展支持升级;
算法是可以随意升级替换,一切由反射+配置文件来完成;
So.。。一个颇有扩展性的小架构就完成了~~ 


用户评论