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

  • 相关阅读:
    彻底理解 Python 生成器
    Windows上虚拟环境的安装及使用
    github怎么绑定自己的域名
    解决ImportError: cannot import name HTTPSHandler
    服务器(Linux) 安装python3
    函数的参数(必选,默认,可变,关键字)
    python 异常处理(try...finally...和with...as 方法)
    LeetCode 33. 搜索旋转排序数组 | Python
    LeetCode 46. 全排列
    LeetCode 面试题51. 数组中的逆序对
  • 原文地址:https://www.cnblogs.com/xiaobang/p/3105637.html
Copyright © 2020-2023  润新知