UML:
CashSuper(父类)
/// <summary> /// 2014-05-21 /// 超市商品收费 /// </summary> public abstract class CashSuper { public abstract double AcceptCash(double money); }
子类:
/// <summary> /// 普通收费 /// </summary> public class NormalCashSuper : CashSuper { public override double AcceptCash(double money) { return money; } }
/// <summary> /// 打折收费 /// </summary> public class RebateCashSuper : CashSuper { public double MoneyRebate { get; set; } public RebateCashSuper(double moneyRebate) { this.MoneyRebate = moneyRebate; } public override double AcceptCash(double money) { return this.MoneyRebate * money ; } }
/// <summary> /// 返利收费 /// </summary> public class ReturnCashSuper : CashSuper { /// <summary> /// 返利金额条件 /// </summary> public double MoneyCondition { get; set; } /// <summary> /// 返利金额 /// </summary> public double ReturnMoney { get; set; } public override double AcceptCash(double money) { if (money >= this.MoneyCondition) { return money - this.ReturnMoney; } else { return money; } } }
策略类:
public class CashContext { private CashSuper cashSuper = null; public CashContext(CashSuper cs) { this.cashSuper = cs; } public double GetResult(double money) { double returnMoney = this.cashSuper.AcceptCash(money); return returnMoney; } }
页面代码:
protected void btnStrategy_Click(object sender, EventArgs e) { CashContext cc = null; int intType = int.Parse(this.DropDownList1.SelectedValue.Trim()); double dbRebate = double.Parse(this.txtRebate.Text.Trim()); double dbConditonMoney = double.Parse(this.txtCondition.Text.Trim()); double dbReturnMoney = double.Parse(this.txtReturnMoney.Text.Trim()); double dbMoney = double.Parse(this.txtMoney.Text.Trim()); switch (intType) { case 1: cc = new CashContext(new NormalCashSuper()); break; case 2: RebateCashSuper rcs = new RebateCashSuper(dbRebate); cc = new CashContext(rcs); break; case 3: ReturnCashSuper recs = new ReturnCashSuper(); recs.MoneyCondition = dbConditonMoney; recs.ReturnMoney = dbReturnMoney; cc = new CashContext(recs); break; } Response.Write(cc.GetResult(dbMoney).ToString()); }
问题
1:书中有提到将页面上的条件判断代码放到策略类中,那折扣,返利等数据如何传递?
如下:public CashContext(int intType,.....?)
{
switch(inttype)
{
case 1:
new NormalCashSuper();
break;
}
}
2:代码中的money指的是计算后的总价。如业务变化,需增加买5退一的业务(即买5个只算4个的价格),如何更改代码?
此业务和以上三种业务的关系是什么(兄弟OR没关系)?
总结:
1:页面只访问了CashContext类,算法和客户端分离了。
2:算法可以单独进行单元测试,互相不受影响。
3:客户端代码简单了。