hl.wang
发布于 2019.09.22 13:58
阅读 2503
评论 0
策略模式
策略模式是指有一定行动内容的相对稳定的策略名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。
什么时候使用?
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
如何使用?
我们拿一个加减乘除的计算举例子来介绍一下策略模式
首先编写抽象策略角色
public interface Strategy {
int calculate(int num1,int num2);
}
然后我们来写加法算法的实现
public class Add implements Strategy {
@Override
public int calculate(int num1, int num2) {
return num1+num2;
}
}
接着是减法算法的实现
public class Substract implements Strategy {
@Override
public int calculate(int num1, int num2) {
return num1-num2;
}
}
最后我们在写一个乘法算法
public class Multiply implements Strategy {
@Override
public int calculate(int num1, int num2) {
return num1*num2;
}
}
然后我们写一个封装这些算法的类
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int getcalculate(int num1,int num2){
return strategy.calculate(num1,num2);
}
}
是不是发现很简单呢,最后我们来测试一下吧
public class Demo {
public static void main(String[] args) {
Context context = new Context(new Add());
System.out.println("计算加法:"+context.getcalculate(1,2));
context = new Context(new Multiply());
System.out.println("计算乘法:"+context.getcalculate(1,2));
context = new Context(new Substract());
System.out.println(("计算减法:"+context.getcalculate(1,2)));
}
}
小结
优点
1、算法可以自由切换
2、避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
3、扩展性良好,增加一个策略只需实现接口即可
缺点
1、策略类数量会增多,每个策略都是一个类,复用的可能性很小
2、所有的策略类都需要对外暴露
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}