设计模式 学习笔记(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都不让客户端认识了。

原文地址:https://www.cnblogs.com/xiaobang/p/3105637.html