感受设计演变过程中所蕴含的大智慧,体会乐于怒的程序人生中值得回味的一幕幕。这是《设计模式——菜鸟天书》——策略模式。
前言:
五月初五过端午。端午节有吃粽子,喝雄黄酒,挂菖蒲、蒿草、艾叶,薰苍术、白芷,赛龙舟的习俗。在我们南方,赛龙舟是必不可少及其重要庆祝活动,一年一次,机会难得呀!
赛龙舟的地方是固定的,人们到达目基地的方式任选。离得近可以骑自行带着对象一起去凑热闹;远点的要做车,才能到;外地的可能要做火车或飞机了。通俗的讲;根据各种条件,依据,来选择合适的策略达到目的___策略模式
大鸟策略模式解释:
定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。
策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。
小菜策略模式的UML图:
环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
抽象策略类(Strategy):定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
回顾大鸟给小菜出的作业——商场收银软件。小菜按部就班的运用简单工厂模式完成作业,但效果并不如意……第二天,小菜交了更改版的,结构图如下:
大鸟:如何把判断收取费用的过程从客户端程序转移??
小菜脑袋一动,眼睛一转,“叮……”想出 :
策略与简单工厂结合:
class CashContext //改造后的CashContext
{
CashSuper cs = null;
public CashContext (string type )
{
switch (type )
{
case "正常收费":
CashNormal cs0 = new CashNormal();
cs = cs0;
break ;
case "满300返100":
CashReturn cr1 = new CashReturn("300", "100");
cs = cr1;
break ;
case "打8折":
CashRebate cr2 = new CashRebate("0.8");
cs = cr2;
break;
}
}
public double GetResult(double money)
{
return cs.acceptCash(money);
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 商场促销
{
// 客户端主要代码
public partial class frmSupormaketer : Form
{
public frmSupormaketer()
{
InitializeComponent();
}
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();
}
private void btnDel_Click(object sender, EventArgs e)
{
txtNum .Text ="";
txtPrice.Text = "";
lbxList.Text = "";
lblResult.Text = "";
}
}
}
运行结果,小菜心里明白……
旁白概述策略模式:
1、策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
2、在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。
3、策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。
策略与简单工厂模式结合后选择具体实现的职责也可以由Conext来承担,这就最大化地减轻了客户端的职责。有需求就得改,任何需求的变更都是需要成本。
《设计模式——菜鸟天书》更新中……