千家信息网

怎么用SpringBoot实现策略模式

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了怎么用SpringBoot实现策略模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。问题的提出阅读别人代码的时候最讨
千家信息网最后更新 2026年11月03日怎么用SpringBoot实现策略模式

这篇文章主要介绍了怎么用SpringBoot实现策略模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

问题的提出

阅读别人代码的时候最讨厌遇到的就是大段大段的if-else分支语句,一般来说读到下面的时候就忘了上面在判断什么了。很多资料上都会讲到使用策略模式来改进这种代码逻辑。

策略模式的类图如下:

只需要按照这个图写代码就可以了。

策略模式代码的实现

借助Spring框架我们能够轻松的实现策略模式。

举一个简单的例子,我们去咖啡店买咖啡的时候,会根据自己的喜好和胃容量选择大小杯。那么我们就要实现一个CoffeeStategy:

package com.example.demo.strategy;public interface CoffeeStrategy {    void offer();}

接下来就是各种具体策略的实现了,以中杯咖啡为例:

package com.example.demo.strategy;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;@Component("MID")@Slf4jpublic class MidCoffee implements CoffeeStrategy {    @Override    public void offer() {        log.info("你的中杯咖啡");    }}

用Component注解给这个类起一个名字叫做MID,这个在后面的应用上下文中有起效。现在就开始定义应用上下文类:

package com.example.demo.strategy;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.Map;@Servicepublic class CoffeeContext {    @Autowired    private Map coffeeStrategyMap;    public void getCoffee(String size) {        this.coffeeStrategyMap.get(size).offer();    }}

因为是使用了Spring框架,所有的Bean都被Spring自行管理,启动之后,Map中会有两个元素:{"MID":MidCoffee}和{"LARGE":LargeCoffee}。在具体的业务逻辑中,只需要引入应用上下文类,每次使用getCoffee方法就可以了。

比如这个Controller方法:

@GetMapping("/get")    public void getCoffee(@Param("size") String size) {        this.coffeeContext.getCoffee(size);    }

请求这个接口,我们能在后台看到具体的日志内容:

2021-09-30 22:46:32.550 INFO 15628 --- [nio-8099-exec-1] com.example.demo.strategy.LargeCoffee : 您的大杯咖啡
2021-09-30 22:46:39.201 INFO 15628 --- [nio-8099-exec-7] com.example.demo.strategy.LargeCoffee : 您的大杯咖啡

进一步的思考

之前写过Component中起的名字有奇效。如果我们没有用Spring框架去实现策略模式,那么我们的代码要如何编写呢?

首先可以肯定的是策略接口和策略实现类是不需要变的。需要变的地方就是应用上下文了,因为不存在自动注入了。这段代码就会变成大致这样:

package com.example.demo.strategy;public class CoffeeContext {    CoffeeStrategy coffeeStrategy;    public CoffeeContext(CoffeeStrategy coffeeStrategy) {        this.coffeeStrategy = coffeeStrategy;    }    public void getCoffee() {        this.coffeeStrategy.offer();    }}

这样,在实际使用的时候,我需要先新建一个具体的实现类对象,然后将这个对象传入策略应用上下文去。这种方式怎么看着都没有Spring的实现方式优雅。

CoffeeStrategy mid = new MidCoffee();CoffeeContext context = new CoffeeContext(mid);context.getCoffee();

在我实际改造代码的过程中我发现有些策略其实是一样的,只是个别参数不同罢了。我对接的是各个业务供应商,有些供应商的接口逻辑式样的,只是URL和USERNAME不一样罢了。于是好几个策略实现类的代码重复很严重,这个时候我使用了Java8开始提供的接口default方法。这种方法的好处就是能将这种一样的逻辑提取到interface中,只要实现类不重写,那么就会默认使用default方法。

这样改造之后,我的代码又精简了很多。

感谢你能够认真阅读完这篇文章,希望小编分享的"怎么用SpringBoot实现策略模式"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

策略 代码 模式 咖啡 上下 上下文 方法 时候 应用 就是 接口 篇文章 逻辑 框架 业务 供应商 只是 名字 大段 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 科技互联网企业 金融科技还是互联网 深圳艾佳互联网科技 美国互联网前沿科技 太原新华互联网科技学校怎么样 农村开互联网科技讲堂 阿里巴巴算科技企业还是互联网 南平创想时代互联网科技有限公司 中国航天科技大学国际工业互联网 知域互联网科技有限公司大骗子 想开互联网科技公司怎么样 互联网金融科技展 允成互联网科技有限公司融资 伊宁互联网科技做什么的 国大互联网教育科技有限公司薪资 美国互联网科技实力 昆明中奇联合互联网科技 容联科技互联网电商 北京瑞云互联网科技有限公司 互联网新科技 互联网科技工作委员会毛军 深圳互联网科技公司 奇酷互联网络科技公司 互联网女皇 腾讯科技 丰台科技园 互联网公司 允成互联网科技有限公司融资 互联网科技大赛获奖感言 科技互联网专业工作会议发言稿 互联网高科技绘画
0