策略模式浅谈

「这是我参与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();
}
复制代码

环境类通过切换不同的策略,执行不同的策略方法。 image.png

三、总结

优点:多重if else判断或者switch语句不易维护,可以使用策略模式进行替换,if else的每一个分支都是一种策略,或者switch语句的每一种情况都可以替换为一种策略。策略模式提供了相同行为的不同实现,使得客户端可以自由的选择想要的实现方式。策略模式还可以对公共的代码进行提取。

缺点:如果策略过多,会增加很多策略类,提高了维护的难度,客户端使用的时候必须了解每一种策略的区别,以便于使用的时候自由的选择。

策略模式的角色:

  1. 环境类:持有一个策略类的角色,给客户端提供调用接口。
  2. 抽象策略类:定义了一个公共的接口,具体策略去进行不同的实现。
  3. 具体策略类:抽象策略类的具体实现。

Guess you like

Origin juejin.im/post/7069551113451601956