您的位置:首页 > 其它

设计模式学习之简单工厂

2012-12-20 13:41 435 查看
最近学习设计模式,这里学到简单工厂模式,现把一个简单计算器的代码写下来!

第一步,做一个页面,这里只是做一个最简单的页面,重点学习设计模式,所以页面就很简单啦,在这个简单计算器里面,我还加上了Jquery.ajax,把简单工厂和ajax一起学了!

我们先写好一个运算类,这个类有两个属性,可以当做变量来看,这两个属性就是,就是我要计算的两个运算数,然后再写一个运算方法,这个方法是virtual的,一个虚方法,只返回一个double类型的值,因为我过会要在子类中重写这个方法,这个运算类其实不会做什么,我所做的,都会在子类中去计算:

运算类如下:

/// <summary>
/// 运算类
/// </summary>
public  class Operation
{
private double numbera;//第一个运算数

public double Numbera
{
get { return numbera; }
set { numbera = value; }
}
private double Numberb;//第二个运算数

public double Numberb1
{
get { return Numberb; }
set { Numberb = value; }
}
public virtual double GetResult() //运算方法,空,在子类中会重写这个方法
{
double  result = 0;
return result;
}

}


写好的运算类后,我们现在开始写加,减,成,除,这4个子类了,这几个类中我们去做各种计算,每个类都继承Operation运算类,这样每个类就都是两个运算数和一个运算方法了
第一个加法类如下:

/// <summary>
/// 加法运算类
/// </summary>
class jiafayunsan:Operation
{
public override double GetResult() //重写父类中的运算方法
{
double result = 0;
result = base.Numbera + base.Numberb1; //用父类中的这个参数相加
return result;
}
}


第二个减法类如下:

/// <summary>
/// 减法类
/// </summary>
class Operationsub:Operation
{
public override double GetResult()//重写父类中的运算方法
{
double result = 0;
result = base.Numbera - base.Numberb1;//用父类中的这个参数相减
return result;
}
}


第三个成法类如下:

/// <summary>
/// 成法类
/// </summary>
class OperationMul:Operation
{
public override double GetResult()//重写父类中的运算方法
{
double retult = 0;
retult = base.Numbera * base.Numberb1;//用父类中的这个参数相成
return retult;
}
}


第4个除法类如下:

/// <summary>
/// 除法类
/// </summary>
class OperationDiv:Operation
{
public override double GetResult()//重写父类中的运算方法
{
double result = 0;
if (base.Numbera > 0)
{
result = base.Numbera / Numberb1;//用父类中的这个参数相除
}
return result;
}
}


现在这4个类都建好了,他们都继承自Operation运算类,但是现在怎么去用呢?那最重要的事情就要开始了,我们然后就要建一个简单工厂运算类,在这个类中我们去实列化过程,这就是工厂:
其实在这个工厂类里面,就是我们整个程序最容易变的地方,以后要是还要加更多的,我只要再加一个子类,在这个工厂类里面再一个判断,就行了,这样保证了,不论怎么变,我都不用去改计算的代码了!

工厂类如下:

/// <summary>
/// 工厂运算类
/// </summary>
public  class JianDanGongchang
{
public static Operation createoperate(string operate)
{
Operation oper = null;

switch (operate)
{
case "+":
oper = new jiafayunsan();//如果是“+”就调用加法类;
break;
case "-":
oper = new Operationsub();//如果是“-”就调用减法类;
break;
case "*":
oper = new OperationMul();//如果是“*”就调用成法类;
break;
case "/":
oper = new OperationDiv();//如果是“/”就调用除法类;
break;
}
return oper;
}
}


后台类写完了,然后我们就开始在前台调了,现在写好页面,新建一个aspx的页面,用JQUERY.POST异步的方式完成计算器,如下

<head runat="server">
<title></title>
<script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {

$("#buttons").click(function () {

var number1 = document.getElementById("number1").value;//第一个运算数
var number2 = document.getElementById("number2").value;//第二个运算数
var yunsanfu = document.getElementById("Select1").value;//运算符

//用Jquery.post方法提交
$.post("Handler1.ashx", { numbera: number1, numberb: number2, yunsanfus: yunsanfu }, function (date) {
document.getElementById("count").value = date;

})
})

})
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="number1" type="text" name="name" value="" />
<select id="Select1">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input id="number2" type="text" name="name" value="" />
<input id="buttons" type="button" vale="=" />
<input id="count" type="text" name="name"  />
</div>
</form>
</body>
</html>


 页面写好了,JS的方法也写好了,然后再建一个ashx页面,在里面来调用简单运算工厂类,完成各种计算,代码如下:

public class Handler1 : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";

string numbera = context.Request.Form["numbera"];//第一个数字

string numberb = context.Request.Form["numberb"];//第二个数字
string numberc = context.Request.Form["yunsanfus"]; //运算符

Operation oper;
oper = JianDanGongchang.createoperate(numberc);//调用简单运算工厂类,传一个运算符,工厂类会帮你自己计算:

oper.Numbera = Convert .ToDouble(numbera); //把一个参数传进来
oper.Numberb1 = Convert .ToDouble(numberb);//把第二个参数传进来

double result = oper.GetResult(); //调用运算方法

context.Response.Write(result); //返回运算回来的结果,回传给WebForm1.aspx页面。
}

public bool IsReusable
{
get
{
return false;
}
}
}


就这样,一个Jquery ajax加简单工厂的计算器就做完了,这里最重要的是学习简单工厂的设计模式!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: