在有多种算法相似的情况下,我们使用 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、所有策略类都需要对外暴露。
参考:
菜鸟教程
大话设计模式