作为一名程序员,必要的总结是不可以缺少的。计划从现在开始到明年年底将《大话设计模式》这本书中所列举的设计模式都纪录一遍用于以后工作的提升!

简单工厂之计算器

写这个功能之前,我需要整理一下写代码的基本思路:写程序必须要以能复用,易于维护为原则,一定要使用面向对象的三大特征 封装继承和多态。引用《大话设计模式》中的一个例子 在活字印刷出来之前,印刷的模板都是一次性使用的,因此一本书的成本太高,这样大规模使用是很难实现的。如果放到当今这个以流量为王的时代绝对会被淘汰。 代码

  1. public class Operation

  2. {
    
  3.     private double _numbA = 0;
    
  4.     private double _numbB = 0;
    
  5.     public double _NumbA
    
  6.     {
    
  7.         get
    
  8.         {
    
  9.             return _numbA;
    
  10.         }
    
  11.         set
    
  12.         {
    
  13.             _numbA = value;
    
  14.         }
    
  15.     }
    
  16.     public double _NumbB
    
  17.     {
    
  18.         get
    
  19.         {
    
  20.             return _numbB;
    
  21.         }
    
  22.         set
    
  23.         {
    
  24.             _numbB = value;
    
  25.         }
    
  26.     }
    
  27.     public virtual double getResult()
    
  28.     {
    
  29.         double result = 0;
    
  30.         return result;
    
  31.     }
    
  32. }
    

//上边是抽象出来其他运算类需要继承的父类。

//下边写具体实现
//加法类

  1. public class OperationAdd : Operation
  2. {
    
  3.     public override double getResult()
    
  4.     {
    
  5.         double result = 0;
    
  6.         result = _NumbA + _NumbB;
    
  7.         return result;
    
  8.     }
    
  9. }
    

//减法类

  1. public class OperationSub : Operation
  2. {
    
  3.     public override double getResult()
    
  4.     {
    
  5.         double result = 0;
    
  6.         result = _NumbA - _NumbB;
    
  7.         return result;
    
  8.     }
    
  9. }
    

//乘法类

  1. public class OperationMulti : Operation
  2. {
    
  3.     public override double getResult()
    
  4.     {
    
  5.         double result = 0;
    
  6.         result = _NumbA * _NumbB;
    
  7.         return result;
    
  8.     }
    
  9. }
    

//除法类

  1. public class OperationDivde : Operation
  2. {
    
  3.     public override double getResult()
    
  4.     {
    
  5.         double result = 0;
    
  6.         if (_NumbB == 0)
    
  7.         {
    
  8.             throw new Exception("除数不能为零!!");
    
  9.         }
    
  10.         result = _NumbA / _NumbB;
    
  11.         return result;
    
  12.     }
    
  13. }
    

//后台类已经写好了,前台控制台程序也好,webform程序也好都可以使用。我是以asp.net webform配合ajax来实现的。 //前台数据通过ajax传递到后台一般处理性程序(ashx)文件,数据处理后将数据传递到前台。 //在这里需要添加一个ashx类的父类,通过反射的方式简化调用程序。

  1. public class Parent : IHttpHandler

  2. {
    
  3.     private string m_flag;
    
  4.     public string Flag
    
  5.     {
    
  6.         get { return m_flag; }
    
  7.         set { m_flag = value; }
    
  8.     }
    
  9.     public void ProcessRequest(HttpContext context)
    
  10.     {
    
  11.         if (context.Request["flag"] != null)
    
  12.             m_flag = context.Request["flag"].ToString();
    
  13.         var methodName = context.Request["flag"];
    
  14.         Type objType = this.GetType();
    
  15.         MethodInfo method = objType.GetMethod(methodName == null ? "" : methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    
  16.         if (method != null)
    
  17.         {
    
  18.             HttpContext[] objParams = new HttpContext[] { context };
    
  19.             method.Invoke(this, objParams);
    
  20.         }
    
  21.         else
    
  22.         {
    
  23.             Other(context);
    
  24.         }
    
  25.     }
    
  26.     public virtual void Other(HttpContext context)
    
  27.     {
    
  28.     }
    
  29.     public bool IsReusable
    
  30.     {
    
  31.         get
    
  32.         {
    
  33.             return false;
    
  34.         }
    
  35.     }
    
  36. }
    

//创建调用类,调用类中的代码

  1. public class Caculate : Parent

  2. {
    
  3.     public void NumOperate(HttpContext context)
    
  4.     {
    
  5.         var expression = context.Request["expression"];//这里是将用户的表达式获取过来
    
  6.         var operateFlag = context.Request["operateFlag"].ToCharArray();
    
  7.         var ExpreArry = expression.Split(operateFlag);//然后通过用户输入的运算符来分割
    
  8.         Operation operate = null;
    
  9.         switch (operateFlag[0])
    
  10.         {
    
  11.             case '+':
    
  12.                 operate = new OperationAdd();
    
  13.                 break;
    
  14.             case '-':
    
  15.                 operate = new OperationSub();
    
  16.                 break;
    
  17.             case '*':
    
  18.                 operate = new OperationMulti();
    
  19.                 break;
    
  20.             case '/':
    
  21.                 operate = new OperationDivde();
    
  22.                 break;
    
  23.         }
    
  24.         operate._NumbA = Convert.ToDouble(ExpreArry[0]);//不论是加减乘除都可以使用同一种方式来调用
    
  25.         operate._NumbB = Convert.ToDouble(ExpreArry[1]);
    
  26.         var result = operate.getResult();
    
  27.         context.Response.Write(result);
    
  28.         context.Response.End();
    
  29.     }
    
  30. }
    

//后台调用完毕,下边开始写前台调用方式。首先需要引用jQuery文件,然后就可以使用jQuery中的方法了。在这里不展示引用(太简单)

//前台HTML布局 使用的是table布局

  1. <body>
  2. <table id="caclator">
    
  3.     <tr>
    
  4.         <td colspan="5">
    
  5.             <input type="text" id="txtExpression" />
    
  6.         </td>
    
  7.     </tr>
    
  8.     <tr>
    
  9.         <td>
    
  10.             <input type="button" value="MC" id="btnMC" />
    
  11.         </td>
    
  12.         <td>
    
  13.             <input type="button" value="MR" id="btnMR" />
    
  14.         </td>
    
  15.         <td>
    
  16.             <input type="button" value="MS" id="btnMS" />
    
  17.         </td>
    
  18.         <td>
    
  19.             <input type="button" value="M+" id="btnMAdd" />
    
  20.         </td>
    
  21.         <td>
    
  22.             <input type="button" value="M-" id="btnMSub" />
    
  23.         </td>
    
  24.     </tr>
    
  25.     <tr>
    
  26.         <td>
    
  27.             <input type="button" value="←" id="btnBackSpace" />
    
  28.         </td>
    
  29.         <td>
    
  30.             <input type="button" value="CE" id="btnCE" />
    
  31.         </td>
    
  32.         <td>
    
  33.             <input type="button" value="C" id="btnC" />
    
  34.         </td>
    
  35.         <td>
    
  36.             <input type="button" value="±" id="Button4" />
    
  37.         </td>
    
  38.         <td>
    
  39.             <input type="button" value="√" id="Button5" />
    
  40.         </td>
    
  41.     </tr>
    
  42.     <tr>
    
  43.         <td>
    
  44.             <input type="button" value="7" id="btnNumSeven" />
    
  45.         </td>
    
  46.         <td>
    
  47.             <input type="button" value="8" id="btnNumEight" />
    
  48.         </td>
    
  49.         <td>
    
  50.             <input type="button" value="9" id="btnNumNine" />
    
  51.         </td>
    
  52.         <td>
    
  53.             <input type="button" value="/" id="btnOperDivide" />
    
  54.         </td>
    
  55.         <td>
    
  56.             <input type="button" value="%" id="Button10" />
    
  57.         </td>
    
  58.     </tr>
    
  59.     <tr>
    
  60.         <td>
    
  61.             <input type="button" value="4" id="btnNumFour" />
    
  62.         </td>
    
  63.         <td>
    
  64.             <input type="button" value="5" id="btnNumFive" />
    
  65.         </td>
    
  66.         <td>
    
  67.             <input type="button" value="6" id="btnNumSix" />
    
  68.         </td>
    
  69.         <td>
    
  70.             <input type="button" value="*" id="btnOperMulti" />
    
  71.         </td>
    
  72.         <td>
    
  73.             <input type="button" value="1/x" id="Button12" />
    
  74.         </td>
    
  75.     </tr>
    
  76.     <tr>
    
  77.         <td>
    
  78.             <input type="button" value="1" id="btnNumOne" />
    
  79.         </td>
    
  80.         <td>
    
  81.             <input type="button" value="2" id="btnNumTwo" />
    
  82.         </td>
    
  83.         <td>
    
  84.             <input type="button" value="3" id="btnNumThree" />
    
  85.         </td>
    
  86.         <td>
    
  87.             <input type="button" value="-" id="btnOperSub" />
    
  88.         </td>
    
  89.         <td rowspan="2">
    
  90.             <input type="button" value="=" id="btnEques" />
    
  91.         </td>
    
  92.     </tr>
    
  93.     <tr>
    
  94.         <td colspan="2">
    
  95.             <input type="button" value="0" id="btnNumZero" />
    
  96.         </td>
    
  97.         <td>
    
  98.             <input type="button" value="." id="btnPoint" />
    
  99.         </td>
    
  100.         <td>
    
  101.             <input type="button" value="+" id="btnOperAdd" />
    
  102.         </td>
    
  103.     </tr>
    
  104. </table>
    
  105. </body>

//仅仅实现了+-*/最基本的算法,因此没有涉及到的按钮id名称就没修改
//以下是css样式设置

  1. <style type="text/css">
  2.     input[type='button']
    
  3.     {
    
  4.         height: 25px;
    
  5.         width: 35px;
    
  6.     }
    
  7.     input[type='button'][value='0']
    
  8.     {
    
  9.         height: 25px;
    
  10.         width: 72px;
    
  11.     }
    
  12.     input[type='button'][value='=']
    
  13.     {
    
  14.         height: 52px;
    
  15.         width: 35px;
    
  16.     }
    
  17.     input[type='text']
    
  18.     {
    
  19.         width: 185px;
    
  20.     }
    
  21. </style>
    

//运行图仿照win7中计算器样式
大话设计模式--计算器-LMLPHP
//最后添加jQuery代码

  1. <script type="text/javascript">

  2. var expression = ""; //存放用户表达式
    
  3. var operateFlag = ""; //存放用户操作 +-*/
    
  4. $(function () {
    
  5.     $("#txtExpression").val('');
    
  6.     $("#caclator").offset({ top: 300, left: 900 });
    
  7.     $.each($("input"), function (i, j) {
    
  8.         if (j.id.indexOf("Num") > -1) {
    
  9.             $("#" + j.id).click(function () {
    
  10.                 expression += this.value;
    
  11.                 $("#txtExpression").val(expression);
    
  12.             })
    
  13.         }
    
  14.     })
    
  15.     $.each($("input"), function (i, j) {
    
  16.         if (j.id.indexOf("Oper") > -1) {
    
  17.             $("#" + j.id).click(function () {
    
  18.                 expression += this.value;
    
  19.                 $("#txtExpression").val(expression);
    
  20.                 if (this.value != ".") {
    
  21.                     operateFlag = "";
    
  22.                     operateFlag = this.value;
    
  23.                 }
    
  24.             })
    
  25.         }
    
  26.     })
    
  27.     $("#btnEques").click(function () {
    
  28.         var url = "/Handler/Caculate.ashx?t=" + new Date();
    
  29.         $.ajax({
    
  30.             type: "POST",
    
  31.             url: url,
    
  32.             data: { flag: "NumOperate", expression: expression, operateFlag: operateFlag },
    
  33.             async: false,
    
  34.             cache: false,
    
  35.             success: function (msg) {
    
  36.                 expression = "";
    
  37.                 $("#txtExpression").val(msg);
    
  38.             },
    
  39.             error: function (msg) {
    
  40.                 if (msg.status == 500) {
    
  41.                     alert("错误,不允许的操作!");//如果除数为0,那么就会弹出提示信息
    
  42.                 }
    
  43.             }
    
  44.         })
    
  45.     })
    
  46. })
    
  47. </script>

07-28 03:36