2.2增加打折
商场收银系统v1.1关键代码如下:
double total = 0.0d;
private void btnOk_Click(object sender, EventArgs e){
double totalPrices = 0d;
//cbxType是一个下拉选择框,分别有“正常收费”、“打8折”、“打7折”和“打5折”
switch(cbxType.SelectedIndex){
case 0:
totalPrices = Convert.ToDouble(txtPrice.Text)
* Convert.ToDouble(txtNum.Text);
break;
case 1:
totalPrices = Convert.ToDouble(txtPrice.Text)
* Convert.ToDouble(txtNum.Text) * 0.8;
break;
case 2:
totalPrices = Convert.ToDouble(txtPrice.Text)
* Convert.ToDouble(txtNum.Text) * 0.7;
break;
case 3:
totalPrices = Convert.ToDouble(txtPrice.Text)
* Convert.ToDouble(txtNum.Text) * 0.5;
break;
}
total = total + totalPrices;
lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text
+ cbxType.SelectedItem + "合计:" + totalPrices.ToString());
lblResult.Text = total.ToString();
}“这下可以了吧,只要我事先把商场可能的打折都做成下拉选择框的项,要变化的可能性就小多了。”小菜说道。

“这比刚才灵活性上是好多了,不过重复代码很多,像Convert.ToDouble(),你这里就写了8遍,而且4个分支要执行的语句除了打折多少以外几乎没什么不同,应该考虑重构一下。不过还不是最主要的,现在我的需求又来了,商场的活动加大,需要有满300返100的促销算法,你说怎么办?”
“满300返100,那要是700就要返200了?这个必须要写函数了吧?”
“小菜呀,看来之前教你的白教了,这里面看不出什么名堂吗?”
“哦!我想起来了,你的意思是简单工厂模式是吧,对的对的,我可以先写一个父类,再继承它实现多个打折和返利的子类,利用多态,完成这个代码。”
“你打算写几个子类?”
“根据需求呀,比如8折、7折、5折、满300送100、满200送50……要几个写几个。”
“小菜又不动脑子了,有必要这样吗?如果我现在要3折,我要满300送80,你难道再去加子类?你不想想看,这当中哪些是相同的,哪些是不同的?”