设计模式一 工厂模式 (2)

来源:互联网 发布:清华北大碾压知乎 编辑:程序博客网 时间:2024/04/29 04:28

上一节中的代码段存在一种弊端,若我们想些一个web段应用的计算器如何实现呢?直接了当-----把上一节的代码段直接拷贝过去。这就是程序员的悲哀 -----Ctrl+C 和Ctrl+V 我们可以试着将业务逻辑层和界面逻辑分开

首先这里要搞清楚的是哪里是业务逻辑层:计算方法即加减乘除运算

界面逻辑层:输入数字和数字显示结果

如下:

//Operation 运算类

public class Operation()

{

      public static double GetResult(double numberA,double numberB,string operate)

      {

           double result = 0d;

          

           switch(operate)

           {

                 case "+":

                         result = numberA  +  numberB;

                         break;

 

                 case "-":

                         result = numberA   -  numberB;

                         break;

 

                 case "*":

                         result = numberA  *  numberB;

                         break;

 

                 case "/":

                         result = numberA  /  numberB;

                         break;          

          }

          return result;

      }

}

 

 

客户端代码
            try
            {
                //输入       
                Console.Write("请输入数字A");
                string strNumberA = Console.ReadLine();
                Console.Write("请选择计算符号+,-,* ,/");
                string strOperate = Console.ReadLine();
                Console.Write("请输入数字B");
                string strNumberB = Console.ReadLine();
                string strResult = "";

 

                strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB),strOperate);

 

                Console.Write("结果是:" + strResult);


            }
            catch (Exception ex)
            {
                throw ex;
            }

 

 如上业务和界面就完全分离了.以后不管Web,PDA,手机等需要运算都可以直接用它了.

不过面向对象有三大特征:封装 ,继承,多态.这里只是用到了封装特性,还有两大特性没有使用呢

我们继续学习:若对于上述计算器代码老板要求增加一个开根运算如何进行?答曰:修改operation类增加开根运算

问题来了:我们只是想增加一个开根运算而已,但是却让加减乘除的运算都要参与进来编译.若我们一不小心把加法改成减法,岂不更糟

根本对策:把加减乘除等运算分离,修改其中一个不受影响.

如下代码:


    //Operation运算类
    public class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;

 

        public double NumberA
        {
            get { return _numberA;  }
            set { _numberA = value; }
        }

 

        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }       
        }

 

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    //加减乘除类
    class OpertionAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

 

    class OpertionSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

 

    class OpertionMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

 

    class OpertionDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
            {
                throw new Exception("除数不能为0");
            }
            result = NumberA / NumberB;
            return result;
        }
    }

 

上面已经圆满的解决了上述的问题,但是新的问题又来了,我们如何让计算器知道我们希望用哪一种算法呢?

这是下一节的问题 简单工厂模式至此现身了

原创粉丝点击