在软件开发中,我们经常遇到针对不同情况使用不同的算法或者逻辑,然后用if/else来控制起来,我们来看个例子,比如说国足要征战世界杯亚洲区12强赛,那么针对不同对手,需要有不同的打法和战术
public void test(String duishou){
if(duishou.equals("韩国")){
System.out.println("执行防守反击战术");
}else if(duishou.equals("伊朗")){
System.out.println("组织配合,一脚传递,中路渗透");
}else if(duishou.equals("卡塔尔")){
System.out.println("边路传中,45度炸");
}
}
一般我们都会这样写,逻辑很清晰,那么在对阵其他对手,比如叙利亚,乌兹别克斯坦时什么战术呢,可能就需要修改这个封装战术的类,或者增加很多if/else,维护起来比较麻烦,这个时候就可以使用策略类了,策略类的好处是把每种策略都封装成独立的类,在执行策略的时候也很方便,不用这么多if/else了
角色:
环境类(Context):维护一个对Strategy对象的引用
抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某具体策略类定义的算法。
具体策略类:以Strategy接口实现某具体算法。
例子:
/*
* Strategy抽象策略角色
*/
public interface Strategy {
public void zhanshu();
}
/*
* 对阵韩国队
*/
public class VsKorea implements Strategy{
@Override
public void zhanshu() {
// TODO Auto-generated method stub
System.out.println("执行防守反击战术");
}
}
/*
* 对阵伊朗队
*/
public class VsIran implements Strategy{
@Override
public void zhanshu() {
// TODO Auto-generated method stub
System.out.println("组织配合,一脚传递,中路渗透");
}
}
/*
* 对阵卡塔尔队
*/
public class VsQatar implements Strategy {
@Override
public void zhanshu() {
// TODO Auto-generated method stub
System.out.println("边路传中,45度炸");
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void zhixingzhanshu(){
this.strategy.zhanshu();
}
}
public class MainClient {
public static void main(String[] args){
Strategy strategy = new VsIran();
Context context = new Context(strategy);
context.zhixingzhanshu();
}
}
运行结果:
组织配合,一脚传递,中路渗透
好了,设计模式-策略模式就总结到这里,如有问题,欢迎指正,谢谢。