策略模式:对于同一个行为,当实施行为的对象发生变化时,具体的实现方式也跟着变化。
直接举个例子:比如公司要举行年会了,组织者设计了一个活跃气氛的环节,做个小游戏,但是做什么游戏不确定,就提前准备了好几个游戏,至于具体做哪个到时候现场决定。
年会的其他流程都是可以确定的,我们就正常实现即可,游戏这里不确定,而不同的游戏他们的内容是不同的,所以游戏这部分就用策略模式来实现。
首先需要一个游戏的抽象和准备几个具体的游戏:
给每个游戏一个类型,以便于使用的时候找到对应的对象
public abstract class Game {
protected String type;
public abstract void play();
}
// 抢凳子
public class Qiangdengzi extends Game{
public Qiangdengzi() {
this.type = "Q";
}
@Override
public void play() {
System.out.println("游戏:大家一起抢凳子,人越多越好玩");
}
}
//你画我猜
public class Nihuawocai extends Game{
public Nihuawocai() {
this.type = "N";
}
@Override
public void play() {
System.out.println("游戏:你画我猜,心有灵犀");
}
}
年会的流程:
public class YearMeeting {
// 这里模拟实际生产中,程序加载时把所有对象都创建出来并缓存起来
private static Map<String, Game> gameMap = new HashMap<>();
static {
gameMap.put("N", new Nihuawocai());
gameMap.put("Q", new Qiangdengzi());
}
// 年会的流程
public void meeting(String type){
// 其他业务逻辑
System.out.println("年会开始了");
System.out.println("领导讲话了");
// 策略行为的逻辑,先获取对应的对象,对象不同,行为逻辑不同
Game game = gameMap.get(type);
game.play();
System.out.println("年会结束了");
}
}
测试:
public class Client {
public static void main(String[] args) {
YearMeeting yearMeeting = new YearMeeting();
// 具体的策略行为要到程序运行之中才能确定
yearMeeting.meeting("Q");
// yearMeeting.meeting("N");
}
}
小结一下:策略模式在开发中应该是挺常用的,它主要可以解决代码中大量的if-else的问题。而且还有很好的扩展性。当我们需要添加新的策略时,直接实现具体的策略即可。在使用策略的地方完全不用修改。