设计模式之策略模式

接下来我们来聊一聊策略模式,这个模式在我们日常开发中涉及的比较多,尤其是我们想在后续为我们的系统进行一定的扩展,那么在设计初期我们就可以多多考虑到策略模式的应用。

1. 概念

策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。

策略模式的主要角色如下:

抽象策略(Strategy)类:公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。

环境(Context)类:持有一个策略类的引用,最终给客户端调用。

2. 代码实现

这里我们以电竞队伍的策略来举例实现,我们一个电竞队类,在进行比赛时,可能会按照多种的比赛策略来进行比赛,可能每一次比赛的策略使用都是不一样的,这里就可以通过策略模式来实现:这里我们先创建抽象策略类(主要用来定义不同策略的抽象)

java 复制代码
/**
 * 游戏策略
 */
public interface GameStrategy {

    //战斗策略
    void warStrategy();

}

这样我们创建不同的具体策略类实现该抽象策略接口:

java 复制代码
public class RandomStrategy implements GameStrategy{

    @Override
    public void warStrategy() {
        System.out.println("大乱斗...");
    }

}
java 复制代码
/**
 * 稳健运营策略
 */
public class SteadyStrategy implements GameStrategy {
    @Override
    public void warStrategy() {
        System.out.println("各路小心...及时支援...");
    }
}

最后我们创建出一个电竞队伍类(即环境类),这个类由于要使用不同的策略,所以我们需要将抽象类作为其的一个属性:

java 复制代码
/**
 * 环境类
 */
public class TeamGNR {

    //抽取游戏策略算法,并进行引用
    private GameStrategy gameStrategy;

    public void setGameStrategy(GameStrategy gameStrategy) {
        this.gameStrategy = gameStrategy;
    }

    public void startGame(){
        System.out.println("游戏开始.....");
        //游戏策略
        gameStrategy.warStrategy();
        System.out.println("win......");
    }
}

这样我们在不同的环境中可以为环境类配置不同的策略行为,使其能够根据不同的情况做出具体策略的行为:

java 复制代码
public class MainTest {

    public static void main(String[] args) {

        TeamGNR gnr = new TeamGNR();

        gnr.setGameStrategy(new RandomStrategy());
        gnr.startGame();
    }
}

3. 应用场景

  • 使用策略模式可以避免使用多重条件语句,如if...else...语句、switch...case..语句
  • Spring中的InstantiationStrategy
  • 线程池拒绝策略
  • ...

4. 总结

策略模式对我来说印象比较深刻,在我第一次进入企业实习时(某互联网保险公司),在阅读项目代码时,曾经有一位资深开发人员写了一段业务代码就是策略+责任链模式来实现的,那时候的我并没有深入学习设计模式,所以导致我花费了很长时间去阅读其写的源码,刚开始认为其是过度设计,但是随着业务的熟悉发现其扩展性是其他开发者写出来无法比拟的。所以从那时候起我就知道作为一名资深开发也好还是项目架构师也好,设计模式对于整个项目后期的维护开发来说是相当重要的。

最后策略模式其实并不是难以理解,但是如何用?何时用?怎样用得好?这才是我们作为开发人员需要在实践与经验中来一点点总结的!

相关推荐
进击的前栈9 小时前
鸿蒙实战:19 页面全景汇总与 7 大共享设计模式回顾
华为·设计模式·harmonyos
刀法如飞9 小时前
Spring Boot 4.1 + JDK 25 DDD开源脚手架,面向 AI 编程
设计模式·架构·ai编程
折哥的程序人生 · 物流技术专研9 小时前
第8篇:模板方法模式的优缺点与面试高频考点
java·设计模式·面试·模板方法模式·行为型模式·优缺点·扩充系列
workflower11 小时前
人形机器人全身运动控制能力大幅提升
人工智能·深度学习·机器学习·设计模式·机器人·自动化
折哥的程序人生 · 物流技术专研11 小时前
Java 23 种设计模式:从踩坑到精通 | 备忘录模式 —— 快照与撤销,给对象装一个“后悔药”
java·设计模式·备忘录模式·行为型模式·java设计模式·从踩坑到精通·撤销重做
Kel11 小时前
万物皆 Runnable:LangChain 如何用一个接口统一模型、链与图
人工智能·设计模式·架构
ttod_qzstudio14 小时前
【软考设计模式】策略模式:算法族的封装与动态切换精讲
设计模式·策略模式
咖啡八杯21 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
ttod_qzstudio1 天前
【软考设计模式】外观模式:复杂子系统的“门面“封装与代码填空精讲
设计模式·外观模式
geovindu1 天前
CSharp: Prototype Pattern
开发语言·后端·设计模式·.net·原型模式·创建型模式