您的位置:首页 > 其它

设计模式之策略模式

2016-04-30 21:06 337 查看

背景:

商场经常会搞促销活动,需要做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。

分析:

商场收银时如何促销,用打折或是返利其实都是一些算法,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的
策略模式:它定义了一个算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

结构图:



代码:

现金收费抽象类:
abstract class CashSuper
{
public abstract double acceptCash(double money);
}
正常收费:
class CashNormal:CashSuper
{
//正常收费,原价返回
public override double acceptCash(double money)
{
return money;
}
}
打折收费:

/// <summary>
/// 打折收费
/// </summary>
class CashRebate:CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);

}
public override double acceptCash(double money)
{

return money * moneyRebate;
}
}
返利收费:
/// <summary>
/// 返利收费子类
/// </summary>
class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyCondition, string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);
this.moneyReturn = double.Parse(moneyReturn);
}
public override double acceptCash(double money)
{
double result = money;
if (money >= moneyCondition)
result = money - Math.Floor(money / moneyCondition) * moneyReturn;

return result;
}
}
CashContext类

/// <summary>
/// CashContext类
/// </summary>
class CashContext
{
private CashSuper  cs; //声明一个CashSuper对象

public CashContext (CashSuper  csuper)
{
this.cs = csuper;

}
public double GetResult(double money)
{
return cs.acceptCash(money );
}

}




Form窗体代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

double total = 0.0d; //用于总计
private void btnOk_Click(object sender, EventArgs e)
{
CashContext cc = null;
switch (cbxType .SelectedItem .ToString ())
{
case "正常收费":
cc = new CashContext(new CashNormal());
break;
case "满300返100":
cc =new CashContext (new CashReturn ("300","100"));
break;
case "打8折":
cc = new CashContext(new CashRebate("0.8"));
break;
}
double totalPrices = 0d;
totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
total = total + totalPrices;
lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text
+ " " + cbxType.SelectedItem + "合计:" + totalPrices.ToString());
lalResult.Text = total.ToString();

}

private void Form1_Load(object sender, EventArgs e)
{
cbxType.Items.AddRange(new object[] { "正常收费", "满300返100", "打8折" });
cbxType.SelectedIndex = 0;
}

private void btnreset_Click(object sender, EventArgs e)
{
txtPrice.Clear();
txtNum.Clear();
lalResult.Text = "";
cbxType.SelectedIndex = 0;
lbxList.Items.Clear();
}
}


总结:

每个模式都有它的精华之处,需要我们好好理解它的奇妙之处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: