什么叫策略模式?用书中定义的话说就是策略模式定义一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
个人理解就是将每个算法分别封装起来,各算法互相之间没有关联,彼此之间相互独立,但他们却可以相互替换。
简单工厂:
通过写商场促销这个例子,我们不难看出,第一次小菜通过用简单工厂把功能实现了,但是在大鸟提出商场可能经常性的更改促销方式,以至于单一使用简单工厂是不行的,因为简单工厂是指由一个工厂对象决定创建出哪一种产品类的实例。也就说实例化谁。所以要是用这个例子的话每次维护都需要改动其中的工厂类。以至于代码总是重复的编译和部署的如下图的代码。
class CashFactory
{
public static CashSuper createCashAccept(string type)
{
CashSUper cs=null;
switch(type)
{
case "正常收费":
cs=new cashNormal();
break;
case "满300返100":
CashReturn cr1=new CashReturn("300","100");
cs=new cashNormal();
break;
case "打8折":
CashRebate cr2=new cashRebate("0.8");
cs=cr2;
break;
}
return cs;
}
}
第二次小菜采用了策略模式的方式编写代码实现了功能,他将CashNormal、CashRebate、CashReturn三种算法(正常收费、打折收费、返利收费),都继承CashSuper抽象策略。如果还有别的收费方式,再写一个类,继承CashSuper就可以了,不需要更改类。通过对CashContext的GetResult方法调用,可以得到收取费用的结果。通过构造方法传入具体的收费策略。小菜在写完后感觉自己又回到了原来的老路,虽然CashContext中不用更改,但它的客户端的代码就要更改了。(客户端代码有条件判断语句,如果增加了其它的,就需要改动了)。
private void BtnOk_Click(object sender, EventArgs e)
{
CashContext cc = null;
switch (CmbDisconut.SelectedItem.ToString())
{//正常收费
case "正常收费":
cc = new CashContext(new CashNormal());
break;
//满三百返100
case "满300返100":
cc = new CashContext(new Cashreturn("x", "y"));
break;
//打折的情况
case "打八折":
cc = new CashContext(new cashRebate("Z"));
break;
}
}
简单工厂和策略模式相结合:
class 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 "打八折":
cashRebate cr2=new cashRebate ("0.8");
cs=cr2;
break;
}
}
}
通过简单工厂和策略模式的结合,使得在具体的收费算法彻底和客户端分离,降低地了两者之间的耦合度,如果在增加新的促销方式时,只需要在switch中添加分支语句即可,还有将判断语句写在CashContext类中比写在客户端中好处就是,增加了代码的复用性,在使用时直接调用CashContext类就可以了。