商场收银软件分析:要求实现不同的打折促销方式,所以可以采用上次学的简单工厂模式来做。
用两个文本框输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,再用一个重置按钮来重新开始。
使用简单工厂的模式实现,把商场可能的打折都做成下拉选择框的项。就可以实现了。
类图解释:写一个CashFactory类来做不同打折方式的分支,在其中调用不同的打折方法,
用一个CashSuper来作为虚方法,用于得到结果,然后把不同的打折方式写成不同的类,继承当前的CashSuper,这样,如果要修改任何一种打折方式,就不需要提供其他算法的代码了。
现金收费工厂类:
public class CashFactory
{
public static CashSuper createCashAccept(string type)
{
CashSuper cs = null;
switch(type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300减100":
cs = new CashReturn("300","100");
break;
case "打八折":
cs = new CashRebate("0.8");
break;
}
return cs;
}
}
public abstract class CashSuper
{
public abstract double acceptCash(double money);
}
三个重写的方法:带参数
public class CashNormal : CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
public 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;
}
}
public class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyCondition,string moneyReturn)
{
this.moneyReturn = double.Parse(moneyReturn);
this.moneyCondition = double.Parse(moneyCondition);
}
public override double acceptCash(double money)
{
double result = money;
if (money >= moneyCondition)
result = money - Math.Floor(money / moneyCondition) * moneyReturn;
return result;
}
}
Form设计:
private void buttonConfirm_Click(object sender, EventArgs e)
{
double total = 0.0d;
CashSuper csuper = CashFactory.createCashAccept(comboBox1.SelectedItem.ToString());
double totalPrices = 0d;
totalPrices = csuper.acceptCash(Convert.ToDouble(textBoxSinglePrice.Text) * Convert.ToDouble(textBoxAmount.Text));
total = total + totalPrices;
richTextBoxDisplay.Text = "单价:" + textBoxSinglePrice.Text + "\n" + "数量:" + textBoxAmount.Text + "\n" + "合计: " +totalPrices.ToString();
labelSummary.Text = "合计" + total.ToString();
}
private void buttonReset_Click(object sender, EventArgs e)
{
textBoxAmount.Text = "";
textBoxSinglePrice.Text = "";
richTextBoxDisplay.Text = "";
comboBox1.Text = "正常收费";
}
但是简单工厂的模式有一个问题:虽然能解决这个问题,这个模式只是解决对象创建的问题,而且由于工厂本身包括了所有的收费方式,商场是可能经常性地更改打折额度和返利额度,每次维护或扩展收费方式都要改动这个工厂,以至于代码需要重新编译部署。这真是一个很糟糕的处理方式,所以它不是最好的办法。面对算法的时常变动,应该有更好的办法。下次去研究一下其他的设计模式,应该会找到更好的答案。