码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式のStrategyPattern(策略模式)----行为模式

时间:2017-12-18 19:11:17      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:rgs   void   readline   str   bst   adl   tle   write   ogr   

一、问题产生背景

       当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理。这些处理和客户端无关,我们可以把这些算法抽象,然后进行处理。之所以叫策略,基本含义就是

针对一个问题,采用一种处理策略。

二、策略模式的通常做法

     1、将类似的算法分离,并抽象。

     2、客户端选择算法(可以结合简单工厂模型,将矛盾转移到别的类里面)

     3、Context调用算法。(Context是业务处理过程中的全部业务信息)

三、具体实例

我想要实现一个简单的计算器功能,首先我要面对的是+、-、*、/四则运算四个算法,我们可以将它抽象

    public abstract class AbstractCalculation
    {
        public void Show()
        {
            Console.WriteLine("这里是一个具体的计算");
        }

        public abstract int Calculation(int iInputLeft, int iInputRight);
    }

然后实现各个具体的运算(以+为示例,其它类似)

    public class Plus : AbstractCalculation
    {
        public override int Calculation(int iInputLeft, int iInputRight)
        {
            return iInputLeft + iInputRight;
        }
    }

这样我们的抽象工作就完成了。

下面我们写上下文类(Context,包含业务处理的全部信息,变量以及操作)

   public class Context
    {
        private int LeftOperator = 0;
        private int RightOperator = 0;
        private AbstractCalculation calculation = null;

        public Context(AbstractCalculation calculation, int iInputLeft, int iInputRight)
        {
            this.calculation = calculation;
            LeftOperator = iInputLeft;
            RightOperator = iInputRight;
        }

        public int Calculate()
        {
            Console.WriteLine("Start Calculate");
            try
            {
                return calculation.Calculation(LeftOperator, RightOperator);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

我们为了简化客户端,采用简单工厂模式将选择的矛盾转义到SimpleFactory中

   public class SimpleFactory
    {
        public static AbstractCalculation CreateCalculation(string oper)
        {
            switch (oper)
            {
                case "+":
                    return new Plus();
                case "-":
                    return new Minus();
                case "*":
                    return new Mutiply();
                case "/":
                    return new Division();
                default:
                    throw new Exception("不支持的操作!");

            }
        }


    }

最后进行组合调用:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("策略模式Demo");

            int intResult = 0;
            int leftOperator;
            int rightOperator;
            string oper;

            while (true)
            {
                Console.WriteLine("请输入第一个操作数:");
                leftOperator = Convert.ToInt32( Console.ReadLine());
                Console.WriteLine("请输入操作符:");
                oper = Console.ReadLine();
                Console.WriteLine("请输入第二个操作数:");
                rightOperator = Convert.ToInt32(Console.ReadLine());

                AbstractCalculation calculation = SimpleFactory.CreateCalculation(oper);
                Context context = new Context(calculation, leftOperator, rightOperator);
                intResult = context.Calculate();

                Console.WriteLine("{0}{1}{2}={3}",leftOperator,oper,rightOperator,intResult);
            }

        }
    }

四、设计模式分析

优点:a、将与具体业务无关的算法分离,便于添加。通常的,因为面向对象语言的最小单位是类,我们最好是添加算法类,而不是修改算法类。

           b、由于context层将算法分离,因此可以添加一些其他渠道的参数,或者添加特殊处理,或者添加日志等。

缺点:并没有解决需要选择算法的矛盾,因此需要结合其他的设计模式处理,就像本利中添加了一个简单工厂,将矛盾从客户端转移,如果需要进一步处理,可以采用反射+配置文件的方式,或者依赖注入。

代码链接

 

 

      

设计模式のStrategyPattern(策略模式)----行为模式

标签:rgs   void   readline   str   bst   adl   tle   write   ogr   

原文地址:http://www.cnblogs.com/xietianjiao/p/8057594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!