返回首页

前言

感谢各位同学的关注与支持,我会一直更新此专题,竭尽所能整理出更为详细的内容分享给大家,但碍于时间及精力有限,代码分享较少,后续会把所有代码示例整理到github,敬请期待。

此章节介绍策略模式。


1、策略模式

在策略模式中,一个类的行为或其算法可以在运行时更改。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。

1.1、UML图


1.2、示例代码

// 版本一:未使用面向对象思想//if (string.IsNullOrEmpty(tbPrice.Text) || string.IsNullOrEmpty(tbCount.Text))//{//MessageBox.Show("单价或数量不能为空");//return;//}//double total = Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text);//_total += total;//rtbList.AppendText("单价:" + tbPrice.Text + " 数量:" + tbCount.Text + " 合计:" + total + "\n");//lbTotal.Text = _total.ToString();// 版本二(增加打折):重复代码过多、未使用面向对象思想//if (string.IsNullOrEmpty(tbPrice.Text) || string.IsNullOrEmpty(tbCount.Text))//{//MessageBox.Show("单价或数量不能为空");//return;//}//double total = 0;//switch (cbxType.SelectedIndex)//{//case 0://total = Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text);//break;//case 1://total = Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text) * 0.8;//break;//case 2://total = Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text) * 0.7;//break;//case 3://total = Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text) * 0.5;//break;//}//_total += total;//rtbList.AppendText("单价:" + tbPrice.Text + " 数量:" + tbCount.Text + " " + cbxType.SelectedItem + " 合计:" + total + "\n");//lbTotal.Text = _total.ToString();// 版本三:简单工厂模式//if (string.IsNullOrEmpty(tbPrice.Text) || string.IsNullOrEmpty(tbCount.Text))//{//MessageBox.Show("单价或数量不能为空");//return;//}//Factory.CashSuper cash = Factory.CashFactory.CreateFactory(cbxType.SelectedItem.ToString());//double total = cash.acceptCash(Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text));//_total += total;//rtbList.AppendText("单价:" + tbPrice.Text + " 数量:" + tbCount.Text + " " + cbxType.SelectedItem + " 合计:" + total + "\n");//lbTotal.Text = _total.ToString();版本三:策略模式//if (string.IsNullOrEmpty(tbPrice.Text) || string.IsNullOrEmpty(tbCount.Text))//{//MessageBox.Show("单价或数量不能为空");//return;//}//Strategy.CashContext cashContext = null;//switch (cbxType.SelectedItem)//{//case "正常收费"://cashContext = new Strategy.CashContext(new Strategy.CashNormal());//break;//case "打八折"://cashContext = new Strategy.CashContext(new Strategy.CashRebate(0.8));//break;//case "满300返100"://cashContext = new Strategy.CashContext(new Strategy.CashReturn(300, 100));//break;//default://break;//}//double total = cashContext.GetResult(Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text));//_total += total;//rtbList.AppendText("单价:" + tbPrice.Text + " 数量:" + tbCount.Text + " " + cbxType.SelectedItem + " 合计:" + total + "\n");//lbTotal.Text = _total.ToString();// 版本四:策略模式、简单工厂模式if (string.IsNullOrEmpty(tbPrice.Text) || string.IsNullOrEmpty(tbCount.Text)){MessageBox.Show("单价或数量不能为空");return;}Strategy.CashContextFactory ccf = new Strategy.CashContextFactory(cbxType.SelectedItem.ToString());double total = ccf.GetResult(Convert.ToDouble(tbPrice.Text) * Convert.ToDouble(tbCount.Text));_total += total;rtbList.AppendText("单价:" + tbPrice.Text + " 数量:" + tbCount.Text + " " + cbxType.SelectedItem + " 合计:" + total + "\n");lbTotal.Text = _total.ToString();