生活随笔
收集整理的這篇文章主要介紹了
大话设计模式--计算器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作為一名程序員,必要的總結(jié)是不可以缺少的。計(jì)劃從現(xiàn)在開(kāi)始到明年年底將《大話設(shè)計(jì)模式》這本書(shū)中所列舉的設(shè)計(jì)模式都紀(jì)錄一遍用于以后工作的提升!
簡(jiǎn)單工廠之計(jì)算器
寫(xiě)這個(gè)功能之前,我需要整理一下寫(xiě)代碼的基本思路:寫(xiě)程序必須要以能復(fù)用,易于維護(hù)為原則,一定要使用面向?qū)ο蟮娜筇卣?封裝繼承和多態(tài)。引用《大話設(shè)計(jì)模式》中的一個(gè)例子 在活字印刷出來(lái)之前,印刷的模板都是一次性使用的,因此一本書(shū)的成本太高,這樣大規(guī)模使用是很難實(shí)現(xiàn)的。如果放到當(dāng)今這個(gè)以流量為王的時(shí)代絕對(duì)會(huì)被淘汰。 代碼
public class Operation
{
private double _numbA = 0;
private double _numbB = 0;
public double _NumbA
{
get
{
return _numbA;
}
set
{
_numbA = value;
}
}
public double _NumbB
{
get
{
return _numbB;
}
set
{
_numbB = value;
}
}
public virtual double getResult()
{
double result = 0;
return result;
}
}
//上邊是抽象出來(lái)其他運(yùn)算類需要繼承的父類。
//下邊寫(xiě)具體實(shí)現(xiàn)
//加法類
public class OperationAdd : Operation {
public override double getResult()
{
double result = 0;
result = _NumbA + _NumbB;
return result;
}
}
//減法類
public class OperationSub : Operation {
public override double getResult()
{
double result = 0;
result = _NumbA - _NumbB;
return result;
}
}
//乘法類
public class OperationMulti : Operation {
public override double getResult()
{
double result = 0;
result = _NumbA * _NumbB;
return result;
}
}
//除法類
public class OperationDivde : Operation {
public override double getResult()
{
double result = 0;
if (_NumbB == 0)
{
throw new Exception("除數(shù)不能為零!!");
}
result = _NumbA / _NumbB;
return result;
}
}
//后臺(tái)類已經(jīng)寫(xiě)好了,前臺(tái)控制臺(tái)程序也好,webform程序也好都可以使用。我是以asp.net webform配合ajax來(lái)實(shí)現(xiàn)的。 //前臺(tái)數(shù)據(jù)通過(guò)ajax傳遞到后臺(tái)一般處理性程序(ashx)文件,數(shù)據(jù)處理后將數(shù)據(jù)傳遞到前臺(tái)。 //在這里需要添加一個(gè)ashx類的父類,通過(guò)反射的方式簡(jiǎn)化調(diào)用程序。
//Parent.ashx中代碼
public class Parent : IHttpHandler
{
private string m_flag;
public string Flag
{
get { return m_flag; }
set { m_flag = value; }
}
public void ProcessRequest(HttpContext context)
{
if (context.Request["flag"] != null)
m_flag = context.Request["flag"].ToString();
var methodName = context.Request["flag"];
Type objType = this.GetType();
MethodInfo method = objType.GetMethod(methodName == null ? "" : methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
{
HttpContext[] objParams = new HttpContext[] { context };
method.Invoke(this, objParams);
}
else
{
Other(context);
}
}
public virtual void Other(HttpContext context)
{
}
public bool IsReusable
{
get
{
return false;
}
}
}
//創(chuàng)建調(diào)用類,調(diào)用類中的代碼
public class Caculate : Parent
{
public void NumOperate(HttpContext context)
{
var expression = context.Request["expression"];//這里是將用戶的表達(dá)式獲取過(guò)來(lái)
var operateFlag = context.Request["operateFlag"].ToCharArray();
var ExpreArry = expression.Split(operateFlag);//然后通過(guò)用戶輸入的運(yùn)算符來(lái)分割
Operation operate = null;
switch (operateFlag[0])
{
case '+':
operate = new OperationAdd();
break;
case '-':
operate = new OperationSub();
break;
case '*':
operate = new OperationMulti();
break;
case '/':
operate = new OperationDivde();
break;
}
operate._NumbA = Convert.ToDouble(ExpreArry[0]);//不論是加減乘除都可以使用同一種方式來(lái)調(diào)用
operate._NumbB = Convert.ToDouble(ExpreArry[1]);
var result = operate.getResult();
context.Response.Write(result);
context.Response.End();
}
}
//后臺(tái)調(diào)用完畢,下邊開(kāi)始寫(xiě)前臺(tái)調(diào)用方式。首先需要引用jQuery文件,然后就可以使用jQuery中的方法了。在這里不展示引用(太簡(jiǎn)單)
//前臺(tái)HTML布局 使用的是table布局
<body> <table id="caclator">
<tr>
<td colspan="5">
<input type="text" id="txtExpression" />
</td>
</tr>
<tr>
<td>
<input type="button" value="MC" id="btnMC" />
</td>
<td>
<input type="button" value="MR" id="btnMR" />
</td>
<td>
<input type="button" value="MS" id="btnMS" />
</td>
<td>
<input type="button" value="M+" id="btnMAdd" />
</td>
<td>
<input type="button" value="M-" id="btnMSub" />
</td>
</tr>
<tr>
<td>
<input type="button" value="←" id="btnBackSpace" />
</td>
<td>
<input type="button" value="CE" id="btnCE" />
</td>
<td>
<input type="button" value="C" id="btnC" />
</td>
<td>
<input type="button" value="±" id="Button4" />
</td>
<td>
<input type="button" value="√" id="Button5" />
</td>
</tr>
<tr>
<td>
<input type="button" value="7" id="btnNumSeven" />
</td>
<td>
<input type="button" value="8" id="btnNumEight" />
</td>
<td>
<input type="button" value="9" id="btnNumNine" />
</td>
<td>
<input type="button" value="/" id="btnOperDivide" />
</td>
<td>
<input type="button" value="%" id="Button10" />
</td>
</tr>
<tr>
<td>
<input type="button" value="4" id="btnNumFour" />
</td>
<td>
<input type="button" value="5" id="btnNumFive" />
</td>
<td>
<input type="button" value="6" id="btnNumSix" />
</td>
<td>
<input type="button" value="*" id="btnOperMulti" />
</td>
<td>
<input type="button" value="1/x" id="Button12" />
</td>
</tr>
<tr>
<td>
<input type="button" value="1" id="btnNumOne" />
</td>
<td>
<input type="button" value="2" id="btnNumTwo" />
</td>
<td>
<input type="button" value="3" id="btnNumThree" />
</td>
<td>
<input type="button" value="-" id="btnOperSub" />
</td>
<td rowspan="2">
<input type="button" value="=" id="btnEques" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="0" id="btnNumZero" />
</td>
<td>
<input type="button" value="." id="btnPoint" />
</td>
<td>
<input type="button" value="+" id="btnOperAdd" />
</td>
</tr>
</table>
</body>//僅僅實(shí)現(xiàn)了+-*/最基本的算法,因此沒(méi)有涉及到的按鈕id名稱就沒(méi)修改
//以下是css樣式設(shè)置
<style type="text/css"> input[type='button']
{
height: 25px;
width: 35px;
}
input[type='button'][value='0']
{
height: 25px;
width: 72px;
}
input[type='button'][value='=']
{
height: 52px;
width: 35px;
}
input[type='text']
{
width: 185px;
}
</style>
//運(yùn)行圖仿照win7中計(jì)算器樣式
//最后添加jQuery代碼
<script type="text/javascript">
var expression = ""; //存放用戶表達(dá)式
var operateFlag = ""; //存放用戶操作 +-*/
$(function () {
$("#txtExpression").val('');
$("#caclator").offset({ top: 300, left: 900 });
$.each($("input"), function (i, j) {
if (j.id.indexOf("Num") > -1) {
$("#" + j.id).click(function () {
expression += this.value;
$("#txtExpression").val(expression);
})
}
})
$.each($("input"), function (i, j) {
if (j.id.indexOf("Oper") > -1) {
$("#" + j.id).click(function () {
expression += this.value;
$("#txtExpression").val(expression);
if (this.value != ".") {
operateFlag = "";
operateFlag = this.value;
}
})
}
})
$("#btnEques").click(function () {
var url = "/Handler/Caculate.ashx?t=" + new Date();
$.ajax({
type: "POST",
url: url,
data: { flag: "NumOperate", expression: expression, operateFlag: operateFlag },
async: false,
cache: false,
success: function (msg) {
expression = "";
$("#txtExpression").val(msg);
},
error: function (msg) {
if (msg.status == 500) {
alert("錯(cuò)誤,不允許的操作!");//如果除數(shù)為0,那么就會(huì)彈出提示信息
}
}
})
})
})
</script>
轉(zhuǎn)載于:https://my.oschina.net/u/4167097/blog/3079982
總結(jié)
以上是生活随笔為你收集整理的大话设计模式--计算器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。