大話設計模式--計算器

做爲一名程序員,必要的總結是不能夠缺乏的。計劃從如今開始到明年年末將《大話設計模式》這本書中所列舉的設計模式都紀錄一遍用於之後工做的提高!javascript

簡單工廠之計算器css

寫這個功能以前,我須要整理一下寫代碼的基本思路:寫程序必需要以能複用,易於維護爲原則,必定要使用面向對象的三大特徵 封裝繼承和多態。引用《大話設計模式》中的一個例子 在活字印刷出來以前,印刷的模板都是一次性使用的,所以一本書的成本過高,這樣大規模使用是很難實現的。若是放到當今這個以流量爲王的時代絕對會被淘汰。 代碼java

  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. }

//上邊是抽象出來其餘運算類須要繼承的父類。web

//下邊寫具體實現
//加法類ajax

  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. }

//乘法類express

  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類的父類,經過反射的方式簡化調用程序。asp.net

//Parent.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中計算器樣式
計算器樣式
//最後添加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>

相關文章
相關標籤/搜索