设计一款商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。那么如何用策略模式实现呢?
策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换 。此模式让算法的变化,不会影响到使用算法的客户。
策略模式结构图
商场收银系统策略图
代码实现
CashContext类。其它类省略……
<span style="font-size:18px;"> class CashContext
{
CashSuper cs = null; //声明一个CashSuper对象
public CashContext (string type)//type为字符串,表示收费类型
{
switch (type )
{
case "正常收费":
CashNormal cs0 = new CashNormal();
cs = cs0;
break;
case "满300返100":
CashReturn cs1 = new CashReturn("300","100");
cs = cs1;
break;
case "打8折":
CashRebate cs2 = new CashRebate("0.8");
cs = cs2;
break;
}
}
public double GetResult(double money)
{
return cs.acceptCash(money); //根据具体的策略对象,调用其算法的方法
}
}</span>
客户端代码
<span style="font-size:18px;"> double total = 0.0d;
private void btnOk_Click(object sender, EventArgs e)
{
CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());//策略模式简单工厂结合
double totalPrices = 0d;
totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble
(txtNum.Text));
total = total + totalPrices;
lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text
+ " " + cbxType.SelectedItem + "合计" + totalPrices.ToString());
lblResult.Text = total.ToString();
}</span>
策略模式就是用来封装算法的。策略模式+简单工厂模式,减轻了客户端的职责。
利用反射,当增加算法时,可以省去Switch语句 的更改。埋下伏笔,神奇的反射……