「这是我参与2022首次更文挑战的第42天,活动详情查看:2022首次更文挑战」。
一、什么是策略模式
我们出行的时候,到一些地方吃饭,一般都是百度地图或者别的地图软件什么的,直接导航,导航的时候的每一种选择,比如步行,地铁,骑车,每一种路线都是一种策略。还有我们打车的时候,选择不同的车型,也是一种策略。还有很多触发类的剧情游戏,每次触发剧情,都有不同的选择,每种选择都是一种策略。策略模式:该模式定义了一系列的算法,并将每一种算法封装起来,每一种算法之间都是可以替换的。
二、策略模式的实现
public interface Strategy {
void travel();
}
复制代码
抽象策略类,此处的方法是出行,出行的具体方式由具体策略类进行实现
public class AirplaneStrategy implements Strategy {
@Override
public void travel() {
System.out.println("通过飞机出行");
}
}
复制代码
具体策略类,通过飞机出行
public class BusStrategy implements Strategy{
@Override
public void travel() {
System.out.println("通过公交车出行");
}
}
复制代码
具体策略类,通过公交车出行
public class TrainStrategy implements Strategy{
@Override
public void travel() {
System.out.println("通过火车出行");
}
}
复制代码
具体策略类,通过火车出行
public class WalkStrategy implements Strategy{
@Override
public void travel() {
System.out.println("通过步行出行");
}
}
复制代码
具体策略类
public class StrategyContext {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void runStrategy() {
strategy.travel();
}
}
复制代码
环境类,持有一个策略类,并且调用策略的方法。
public static void main(String[] args) {
StrategyContext context = new StrategyContext();
context.setStrategy(new AirplaneStrategy());
context.runStrategy();
context.setStrategy(new BusStrategy());
context.runStrategy();
context.setStrategy(new TrainStrategy());
context.runStrategy();
context.setStrategy(new WalkStrategy());
context.runStrategy();
}
复制代码
环境类通过切换不同的策略,执行不同的策略方法。
三、总结
优点:多重if else判断或者switch语句不易维护,可以使用策略模式进行替换,if else的每一个分支都是一种策略,或者switch语句的每一种情况都可以替换为一种策略。策略模式提供了相同行为的不同实现,使得客户端可以自由的选择想要的实现方式。策略模式还可以对公共的代码进行提取。
缺点:如果策略过多,会增加很多策略类,提高了维护的难度,客户端使用的时候必须了解每一种策略的区别,以便于使用的时候自由的选择。
策略模式的角色:
- 环境类:持有一个策略类的角色,给客户端提供调用接口。
- 抽象策略类:定义了一个公共的接口,具体策略去进行不同的实现。
- 具体策略类:抽象策略类的具体实现。