定义一组算法,将每个算法都封装起来,并且使他们之间可以相互互换。策略模式会使这些算法在客户端调用他们的时候能够互不影响他们的额变化。(Java中的TreeSet集合,构造方法传入具体的比较器以实现不同的排序算法,就是利用的这种策略模式I’m )。
优缺点
优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性非常好。
缺点:
- 策略类会增多。
- 所有的策略类都必须向外暴露。
场景假设
模拟小明约了一群智商不等的人商量去一起旅行,但是有些人聪明,选择做飞机过去,有些人傻蛋,选择骑单车过去。不同的人选择出行的方式不同,所以我们可以吧他们怎么出行定义为抽象策略角色,他们旅行也定义为一种策略,因为出行方式不同。
实现
首先,肯定是定义一个出行工具tool,他们出行的方式有airplane()、bicycle(),但是会根据他们的选择而发生变化,所以我们要抽出来。
创建一个接口。
public interface Tool {
public String travel();
}
创建实现接口的实体类。(飞机、步行)
public class ToolAirplane implements Tool {
@Override
public String travel() {
return "我比较聪明, 我选择做飞机过去";
}
}
public class ToolWalk implements Tool {
@Override
public String walk() {
return "我是傻帽,我要步行旅游";
}
}
创建 Context 类。
public class Context {
private Tool tool;
public Context(Tool tool){
this.tool = tool;
}
public int executeTool(){
return tool.travel();
}
}
使用 Context 来查看当它改变策略 Tool 时的行为变化。
public class ToolPatternDemo {
public static void main(String[] args) {
Context c = new Context(new ToolAirplane());
System.out.println(c.executeTool());
Context c1 = new Context(new ToolWalk());
System.out.println(c1.executeTool());
}
}
执行程序,输出结果:
我比较聪明, 我选择做飞机过去
我是傻帽,我要步行旅游
其实就是将不同的算法抽象,通过上下文切换策略实现不同行为。我们还可以使用策略模式代替很多的if else 判断执行不同的算逻辑。