设计模式----策略模式

  策略模式

    策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
    仍然用商场促销为例  策略模式的UML图如下
    

     代码实现:
   上篇中CashSuper就是一个抽象策略,CashNormal、CashRebate和CashReturn 是三个具体的策略,在类中我们只需要将CashContext类代替CashFactory工厂就可以:
  
 class CashContext
     {
         private CashSuper cs;
         public CashContext(CashSuper csuper)
         {
             this.cs = csuper;
         }
         
         public double GetResult(double money)
         {
             return cs.acceptCash(money);
         }

     }
   将客户端程序改为:
//客户端主要代码
        double total = 0.0d;
        private void btnOK_Click(object sender, EventArgs e)
        {
            CashContext cc = null;
            switch (cbxType.SelectedItem.ToString())//根据下拉选择框,将相应的策略对象作为参数传入CashContext的对象中
            {
                case "正常收费":
                    cc = new CashContext(new CashNormal());
                    break;
                case "满300返100":
                    cc = new CashContext(new CashReturn("300", "100"));
                    break;
                case "打8折":
                    cc = new CashContext(new CashRebate("0.8"));
                    break;
            }
            
            double totalPrices = 0d;
                     
            totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));//通过Context的GetResult方法的调用,可以得到收取费用的结果,让具体算法与客户进行了隔离
            
                      total = total + totalPrices;
            lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text + "" + cbxType.SelectedItem + "合计:" + totalPrices.ToString());
            lblResult.Text = total.ToString();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cbxType.Items.Add("正常收费");
            cbxType.Items.Add("满300返100");
            cbxType.Items.Add("打8折");
           
        }

策略模式与简单工厂模式的区别

      策略模式和简单工厂模式看起来非常相似,都是通过多态来实现不同子类的选取,这种思想应该是从程序的整体来看得出的。如果从使用这两种模式的角度来看的话,我们会发现在 简单工厂模式 中我们 只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作 。而 策略模式 ,使用时 必须首先创建一个想使用的类对象,然后将该对象最为参数传递进去,通过该对象调用不同的算法 。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。

      结合上面的代码和下面的释义不难看出,其实两个的差别很微妙,Factory是直接创建具体的对象并用该对象去执行相应的动作,而Context将这个操作给了Context类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。

策略模式与简单工厂相结合

         改后的CashContext
 
class CashContext
     {

        
         CashSuper cs = null; //声明一个CashSuper对象

         public CashContext(string type)//注意参数不是具体的收费策略对象,而是一个字符串,表示收费类型
         {
             switch (type)
             {
                 //将实例化具体策略的股从横由客户端转移到Context类中,简单工厂的应用
                 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);
         }

     }
客户端的程序为:
   //客户端主要代码
        double total = 0.0d;
        private void btnOK_Click(object sender, EventArgs 


e)
        {
           CashContext csuper = new CashContext


(cbxType.SelectedItem.ToString());//根据下拉选择框,将相应


的算法类型字符串传入CashContext的对象中


           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 Form1_Load(object sender, EventArgs 


e)
        {
            cbxType.Items.Add("正常收费");
            cbxType.Items.Add("满300返100");
            cbxType.Items.Add("打8折");
           
        } 
       简单工厂模式我需要让客户端认识两个类CashSuper、CashFactory而策略模式与简单工厂结合的用法,客户端只需要认识一个类CashContext就可以了,耦合更为降低

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值