设计模式第二章 策略模式

        断断续续总算看完了这一节,下面小总结一下。

        策略模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

        样例:

        //抽象算法类

         abstract class Strategy    //Strategy类,定义所有支持的算法的公共接口

          {

               //算法方法

                public abstract void AlgorithmInterface();

          }

          ConcreteStrategy,封装了具体的算法或行为,继承于Strategy

          class ConcreteStrategyA:Strategy           //具体算法A

          {

                public  override void AlgorithmInterface()     //算法A实现方法

                     {

                          Console.WriteLine("算法A实现");

                      }

          }

         class ConcreteStrategyB:Strategy           //具体算法B

          {

                public  override void AlgorithmInterface()     //算法A实现方法

                     {

                          Console.WriteLine("算法B实现");

                      }

          }

         class ConcreteStrategyC:Strategy           //具体算法C

          {

                public  override void AlgorithmInterface()     //算法A实现方法

                     {

                          Console.WriteLine("算法C实现");

                      }

          }

          Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。

           //上下文

        class Context         

          {

                Strategy strategy;

                public  Context (Strategy strategy)     //初始化时,传入具体的策略对象

                     {

                          this.strategy=strategy;

                      }

                public  void ContextInterface (Strategy strategy)     //上下文接口   根据具体的策略对象,调用其算法的方法

                     {

                          strategy.AlgorithmInterface();

                      }


          }

          客户端代码

           static void Main(string[] args)

           {

                Context context;

                context=new Context(new ConcreteStrategyA());  //由于实例化不同的策略,所以最终在调用context.ContextInterface();时,所获得得结果就不尽相同

                context.ContextInterface();

                context=new Context(new ConcreteStrategyB());

                 context.ContextInterface();

                 context=new Context(new ConcreteStrategyC());

                 context.ContextInterface();

            }

            下面是一个demo,用于实现商场的计费软件。可以填写商品个数,商品单价,优惠情况(正常,八折,满三百返一百等),根据不同得优惠得到总消费。

             当用策略模式实现功能时,会发现策略得选择是在客户端实现得,没有降低客户端得压力。所以可以试着将简单工厂模式和策略模式相结合,将策略得选择放在

            Context类中实现,这样客户端只需要传入对应得优惠方式,只需要认识Context类就可以了。下面是简单得实现:

           public abstract class CashSuper {    //抽象基础基类,抽取公共得方法
               public abstract double getCash(double money);
         }

         public class NormalCash extends CashSuper {     //正常类子类
          @Override
          public double getCash(double money) {
             return money;
          }
        }

         public class ReturnCash extends CashSuper {      //返回类子类
           String conditation;   //conditation是满多少
           String back;   //back是返多少
         public ReturnCash(String conditation,String back){  
             this.conditation=conditation;
             this.back=back;
           }
        @Override
        public double getCash(double money) {      //money传入得总钱数
              return money-money/Double.valueOf(conditation)*Double.valueOf(back);
           }
        }

          public class DebateCash extends CashSuper {   //打折子类
             String debate;  //打折百分比
          public DebateCash(String debate){
                 this.debate=debate;
           }
         @Override
        public double getCash(double money) {
             return money*Double.valueOf(debate);
          }
       }

     

     public class CashContext { //Context类,根据type类型选择对应得策略,调用对应策略得对应方法
    CashSuper cashsuper = null;

    public CashContext(String type) {//type为传入得优惠方式
        switch (type) {
        case "正常":
            cashsuper = new NormalCash();
            break;
        case "打八折":
            cashsuper = new DebateCash("0.8");
            break;
        case "满三百返一百":
            cashsuper = new ReturnCash("300", "100");
            break;

        default:
            break;
        }
    }

     public double getRes(double money) {
         return cashsuper.getCash(money);//调用对应策略得对应优惠方法
      }
    }

    客户端代码:

    CashContext context=new CashContext("满三百返一百");//根据传入得优惠方法选择对应得优惠策略
     res.setText(context.getRes(total)+"");//total为总消费数,调用对应策略得方法获取优惠后得总价格


     策略模式是一种定义一系列算法得方法,从概念上来看,所有这些算法完成得都是相同得工作,只是实现不同,它可以以相同得方式调用所有得方法,减少了各种算法类与使用算法类之间得耦合。

      策略模式得strategy类层次为context定义了一系列得可供重用得算法或行为。继承有助于析取出这些算法中得公共功能。

       策略模式得优点是简化了单元测试,因为每个算法都有自己得类,可以通过自己得接口单独测试。

           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值