设计模式 学习笔记(1)简单工厂模式、策略模式
1.简单工厂模式
用一个单独的类来做创造实例的过程。
public class OperationFactory{
public static Operation createOperate(string operate){
Operation oper=null;
switch (operate){
case “+”:
oper=new OperationAdd();break;
case “-”:
oper=new OperationSub();break;
case "*":
oper=new OperationMul();break;
case "/":
oper=new OperationDiv();break;
}
return oper;
}
}
2.策略模式
策略模式定义了算法家族。分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。
算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是面向对象的一种很重要的思维方式。
(1)策略与工厂模式结合到一起
//维护一个策略对象的引用
class CashContext{
CashSuper cs=null;
public CashContext(string type){ //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"); //实例化具体策略的过程由客户端转移到Context类中。
cs=cr2;
break;
}
}
public double GetResult(double money){
return cs.acceptCash(money);
}
public double GetResult(double money){
return cs.acceptCash(money);
}
}
//客户端代码
double total=0.0d;
private void btn_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+=totalPrices;
lbxList.Items.Add("单价"+txtPrices.text+"数量:"+txtNum.Text+" "+cbxType.SelectedItem+" 合计:"+totalPrices.ToString());
}
//简单工厂模式的写法
CashSuper csuper=CashFactory.createCashAccept(cbxType.SelectedItem.ToString());
...=csuper.GetResult(...);
//简单工厂和策略模式结合到一起
CashContext csuper=new CashContext(cbxType.SelectedItem.ToString());
...=csuper.GetResult(...);
简单工厂模式需要认识两个类,CashSuper和CashFactory,而策略模式与简单工厂结合后,客户端就只需要知道一个类 CashContext类就可以了。耦合更低。我们在客户端实例化的是CashContext的对象,调用的是CashContext的方法 GetResult方法,这使得具体的收费算法彻底地与客户端分离。连算法的父类CashSuper都不让客户端认识了。