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

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

作者: 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、所有策略类都需要对外暴露。

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

相关文章

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

    在有多种算法相似的情况下,我们使用 if...else的话就会有很多缺点:1.进行多次判断,效率极其低下2.可扩展...

  • 震惊!居然有如此容易理解的——单例模式

    写在前面的话:本人自己认为学的其实不算好,写这些是为了自己能够总结中提高,还有忘记了的时候能回来瞄一眼~~~所以写...

  • 设计模式:(四)行为型模式

    一、策略模式 策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握,策略模式的三个角色: Context...

  • JS设计模式-策略模式

    策略模式利用组合、委托等技术和思想,可以避免很多if条件语句 策略模式提供了开放-封闭原则,使代码更容易理解和拓展...

  • 策略模式

    由于策略模式和工厂模式很像 主要区别 我的理解: 工厂模式就是需要什么生产什么 策略模式就是根据已有的策略选择用什...

  • 设计模式-策略模式

    emmm.. 什么叫策略模式呢? 我接下会来通过吃鸡的武器来给大家讲解,以便于大家理解什么是策略模式 策略模式的...

  • 理解策略模式

    策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一组行为接口和具体的实现。策略模式最大的特点是行为的变化...

  • 设计模式之死磕策略模式(原创)

    本篇文章主要讲的是策略模式基本概念以及应用场景。 首先,策略模式是属于行为型模式的一种,为了更好的理解策略模式,我...

  • 2. 设计模式之策略模式

    一、定义 今天我们讨论的设计模式是「策略模式」,策略模式比较好理解,首先我们看一下他的定义: 策略模式是一种定义一...

  • 018--IDEA王者荣耀学习设计模式

    1、写在前面 通过【王者荣耀】学习设计模式 2、核心操作 进行代码编写(策略模式+单例模式) 理解策略模式 3、具...

网友评论

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

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