美文网首页程序员
震惊!居然有如此容易理解的——策略模式

震惊!居然有如此容易理解的——策略模式

作者: AceCream佳 | 来源:发表于2017-03-29 21:19 被阅读0次

    在有多种算法相似的情况下,我们使用 if...else的话就会有很多缺点:
    1.进行多次判断,效率极其低下
    2.可扩展性太差,维护起来实在是很费劲

    Q:那么如何去解决这个问题呢?
    A:使用策略模式,利用封装性,将算法封装起来,使用的时候去替换就可以了。

    步骤如下:

    1.写一个策略接口
    2.写n个实现类,去实现接口(具体数量看需求)
    3.写一个Context类,这个类承上启下
    4.决定我们使用的策略,并灵活运用

    说起来步骤来比较费劲,其实代码实现的话还是蛮容易理解的:

    代码

    步骤1:写个策略接口,这里面我就写了一个方法。大家可以按需求写

    /**
     * Created by AceCream on 2017/3/29.
     * 策略接口
     */
    public interface Strategy {
        public String operate(String s);
    }
    

    步骤2:写n个实现类,去实现接口(具体数量看需求)
    这里写的比较暴力,三个类都是,直接使用字符串做参数这样比较直观。其实真正使用的时候可以按照自己喜好去改变。

    /**
     * Created by AceCream on 2017/3/29.
     */
    public class OperationOne implements Strategy{
    
        @Override
        public String operate(String s) {
            s = "第一个策略!......"+ s;
            return s;
        }
    
    }
    
    class OperationTwo implements Strategy{
    
        @Override
        public String operate(String s) {
            s = "第二个策略!......." + s;
            return s;
        }
    }
    
    class OperationThree implements Strategy{
    
        @Override
        public String operate(String s) {
            s = "第三个策略!......" + s ;
            return s;
        }
    }
    

    步骤3:写Context类
    这个Context类厉害了!请注意这个类是承上启下的:
    1.构造函数里传的参数是具体的策略,在我们实例化Context的时候,我们可以通过改变参数的方式,去决定我们需要的策略。
    2.我在这个类中写了个执行策略的方法“executeStrategy(String s)”
    这就意味着,在客户端传具体需要处理的数据之前我们已经把策略决定好了,传过来的数据可以在我们决定的策略中去执行!

    /**
     * Created by AceCream on 2017/3/29.
     */
    public class Context {
    
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public String executeStrategy(String s){
            return strategy.operate(s);
        }
    
    }
    
    

    步骤4:决定我们使用的策略,并灵活运用。其实就是测试一下
    package 策略模式;

    /**
     * Created by AceCream on 2017/3/29.
     */
    public class Test {
        public static void main(String[] args) {
            Context context;
    
            context = new Context(new OperationOne());
            System.out.println(context.executeStrategy("草船借箭!"));
    
            context = new Context(new OperationTwo());
            System.out.println(context.executeStrategy("过河拆桥!"));
    
            context = new Context(new OperationThree());
            System.out.println(context.executeStrategy("顺手牵羊!"));
    
        }
    }
    

    效果

    测试图

    总结

    这里总结一下:

    所属:行为型模式

    • 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
    • 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
    • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
    • 如何解决:将这些算法封装成一个一个的类,任意地替换。
    • 关键代码:实现同一个接口。
    • 优点:
      1、算法可以自由切换。
      2、避免使用多重条件判断。
      3、扩展性良好。
    • 缺点:
      1、策略类会增多。
      2、所有策略类都需要对外暴露。

    参考:
    菜鸟教程
    大话设计模式

    相关文章

      网友评论

        本文标题:震惊!居然有如此容易理解的——策略模式

        本文链接:https://www.haomeiwen.com/subject/ampyottx.html