• 策略模式


    转载请注明出处!

    。!http://blog.csdn.net/zhonghuan1992

      全部配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern

     

     

     

    跟着ZHONGHuan学习设计模式

    策略模式

     

     

     

     

        依据GOF95,策略模式是对象的行为模式,其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中。从而使得它们能够相互替换。

    策略模式使得算法能够在不影响到client的情况下发生变化。

        还记得简单工厂吗?简单工厂就是将创建对象那一块代码提取出来,化身成为一个工厂,然后每当要new对象的时候。直接调用工厂类的创建方法就能够了,不用自己来手动new。事实上策略模式有一些同样之处。只是策略模式封装的是策略,也能够说是算法。

    将这些解决这个问题的代码块封装起来。当要用时,直接调用就能够了。

    这个就是策略模式。是不是不难理解啊!

        以下我们来看一下策略模式的结构图!

            

    这个模式涉及到三个角色:

    环境(Context)角色持有一个Strategy的引用。

    抽象策略(Strategy)角色这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出全部的详细策略类所需的接口。

    详细策略(ConcreteStrategy)角色包装了相关的算法或行为。

    来看一下代码:

    上下文对象类

    public class Context {
     
        private Strategy strategy; //详细策略的对象
       
        // 构造函数,能够传入一个详细策略对象
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
      
        public voidcontextInterface(){
           
            strategy.strategyInterface(); //这里是Context须要使用某个策略对象的方法了
        }
       
        public void setStrategy(Strategy strategy){
             this.strategy = strategy;
        }
       
        public StrategygetStrategy(){
            return strategy;
        }
    }


    抽象策略角色:

    public interface Strategy {
        //策略方法,详细的实现交给详细的子类决定
        public voidstrategyInterface();
    }


    详细的策略类:

    public class ConcreteStrategyA implements Strategy {
     
        public voidstrategyInterface() {
            //详细的策略(算法)A,等待实现
        }
     
    }
     
    public class ConcreteStrategyB implements Strategy {
     
        public voidstrategyInterface() {
            //详细的策略(算法)B,等待实现
        }
     
    }


             上面的样例不够清晰,让我们用一个比較清晰的样例来说明吧,今天正好去理发了。那个理发店有个这种规矩,普通会员卡打8折,黄金会员卡打6折。(嗯哼。赤果果的对我的鄙视,我~~~~我没有会员卡╮(╯▽╰)╭)

             好了。应对这样的情况,最好的方式是策略模式啦,这样改动策略的时候,直接在策略类那儿改动或者添加策略的都是非常方便的,所以这儿採用策略模式非常好。实现代码例如以下:

    interface Strategy{
        public double cost(double money); //依据传进去的价格。返回一个确切的价格。由于终于价格会依据情况来定嘛
    }
     
    class PuTong implements Strategy{//原谅我直接上中文拼音了
     
        @Override
        public double cost(double money)
        {
           return money*0.8;//普通会员打8折
        }
       
    }
     
    class Super implements Strategy{
     
        @Override
        public double cost(double money)
        {
          
           return money*0.6; //黄金会员嘛。打6折
        }
       
    }
     
    public class Client{
        public static void main(String[] args)
        {
           Strategy strategy = new Super();//土豪用的是超级会员卡
           System.out.println("原价100的理发,打完折要付:"+strategy.cost(100)); //土豪理发100会不会廉价点嘿嘿
          
           strategy = new PuTong();
           System.out.println("原价30的理发,打完折要付: "+strategy.cost(30)); //普通卡理发就这价。差距在哪里,哎~~
        }
    }


     

    何时该使用策略模式:

             策略模式嘛,最重要的是。这些策略是否有必要单独拿出来。比方我们常常会使用排序sort方法。它封装了高速排序算法,由于常常使用,很有必要封装起来,供使用。

    所以。当我们的策略是一般的,能够抽取出来公用的时候,应当使用策略模式。

    策略模式的长处

      (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承能够把公共的代码移到父类里面。从而避免代码反复。

    (2)使用策略模式能够避免使用多重条件(if-else)语句。多重条件语句不易维护。它把採取哪一种算法或採取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

    策略模式的缺点

      (1)client必须知道全部的策略类,并自行决定使用哪一个策略类。

    这就意味着client必须理解这些算法的差别,以便适时选择恰当的算法类。换言之,策略模式仅仅适用于client知道算法或行为的情况。

      (2)因为策略模式把每一个详细的策略实现都单独封装成为类,假设备选的策略非常多的话,那么对象的数目就会非常可观。

  • 相关阅读:
    P3478 [POI2008]STA-Station
    P2015 二叉苹果树
    P2014 选课 (树型背包模版)
    求树的每个子树的重心
    求树的直径
    Javascript--防抖与节流
    JavaScript中call和apply的区别
    解决谷歌浏览器“此Flash Player与您的地区不相容,请重新安装Flash”问题(最新版)
    matlab实验代码(总)
    表达式树
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7019115.html
Copyright © 2020-2023  润新知