springboot项目中使用设计模式一策略模式

【设计模式】——策略模式 策略模式是一种强大而灵活的设计模式,它可以帮助我们处理不同的算法或行为,并使系统更具可维护性和扩展性。通过封装具体的策略类和使用上下文对象,我们可以轻松地选择和切换不同的策略,而无需修改现有的代码。 阅读详情

策略模式: 

使用常用,支付,之前做了微信支付,支付宝支付,然后另外一个同事写了一个银联支付,那么如果代码方法一起就会导致代码不是很好操作所以,采用策略模式进行,同事只需要写一个实现类,就可以了,

在协作过程中比较容易。

 

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法

 

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

 

使用案例代码:

策略接口:执行的方法

package com.cxy.ssp.strategy;

public interface Strategy {
    String getVpcList(DemoPojo demoPojo);
}

实体类:

package com.cxy.ssp.strategy;

public class DemoPojo {
    private String poolid;
    private String orderId;
    private String name;

    public String getPoolid() {
        return poolid;
    }

    public void setPoolid(String poolid) {
        this.poolid = poolid;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public DemoPojo(String poolid, String orderId, String name) {
        this.poolid = poolid;
        this.orderId = orderId;
        this.name = name;
    }

    public DemoPojo() {

    }
}

实现类:

1

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component;

@Component("A")
public class SA implements Strategy {
    @Override
    public String getVpcList(DemoPojo demoPojo) {
        System.out.println("A,getVpcList ==========="+demoPojo);
        return demoPojo.getName();
    }
}

2 

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component;

@Component("B")
public class SB implements Strategy {
    @Override
    public String getVpcList(DemoPojo demoPojo) {
        System.out.println("b,getVpcList ==========="+demoPojo);
        return demoPojo.getName();
    }
}

3

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component;

@Component("C")
public class SC implements Strategy {
    @Override
    public String getVpcList(DemoPojo demoPojo) {
        System.out.println("c"+demoPojo);
        return demoPojo.getName();
    }
}

策略context

package com.cxy.ssp.strategy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/***、
 *通过Spring将实现Strategy的实现类都自动注入到strategyMap类中,
 * 当用户传入选择的资源池时,自动根据资源池id去对应的资源池实现中查找资源。
 *
 */
@Service
public class SimpleContext {
    @Autowired
    private final Map<String, Strategy> strategyMap = new ConcurrentHashMap<>();

    public SimpleContext(Map<String, Strategy> strategyMap) {
        this.strategyMap.clear();
        strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
    }

    public String getResource(DemoPojo demoPojo){
        return strategyMap.get(demoPojo.getPoolid()).getVpcList(demoPojo);
    }
}

策略服务L:

package com.cxy.ssp.controller;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.SimpleContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class TestController {
    @Autowired
    private SimpleContext simpleContext;

    @PostMapping("/choose")
    public String choose(@RequestBody DemoPojo demoPojo){
        return simpleContext.getResource(demoPojo);
    }
}

外加一个核心启动类:

package com.cxy.ssp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SspApplication {

    public static void main(String[] args) {
        SpringApplication.run(SspApplication.class, args);
    }

}

就已经完成了。思想:将实现类交给spring去管理,通过接口的注入,获取对应的类型,再通过context进行调用执行的方法:

测试:

 

 

 

 

 

 此时应该有人怀疑:调用了同一个方法,然后输出的都是一个方法。

那么进行修改代码:

package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component;

@Component("A")
public class SA implements Strategy {
    @Override
    public String getVpcList(DemoPojo demoPojo) {
        System.out.println("A,getVpcList ==========="+demoPojo);
        return demoPojo.getName()+"a";
    }
}
package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component;

@Component("B")
public class SB implements Strategy {
    @Override
    public String getVpcList(DemoPojo demoPojo) {
        System.out.println("b,getVpcList ==========="+demoPojo);
        return demoPojo.getName()+"b";
    }
}
package com.cxy.ssp.strategy.impl;

import com.cxy.ssp.strategy.DemoPojo;
import com.cxy.ssp.strategy.Strategy;
import org.springframework.stereotype.Component;

@Component("C")
public class SC implements Strategy {
    @Override
    public String getVpcList(DemoPojo demoPojo) {
        System.out.println("c"+demoPojo);
        return demoPojo.getName()+"c";
    }
}

 

 

 

 就测试到这里,那么如果传输的那个poolid传输错误了改怎么处理呢:

 

 服务器端报错误:说明没有这个方法,

那么可以在context中进行限制:

 

 

首先判断是否包含,如果不包含,就可以直接threw一个异常,让前台直接显示

Springboot 使用设计模式- 策略模式 前言 直白点,什么场景我们需要使用到设计模式- 策略模式。 在平常的springboot项目里面做CRUD,我们的习惯性基本是 一个mapper,一个service,一个serviceImpl。 但是有时候会出现一种情况,就是实现类impl里面虽然业务主线是归为一致的,但是需要进行类别判断去执行不同的业务逻辑, 导致impl里面出现 一个类别的if 后面跟上一大段业务代码,然后同时存在这一几个 if 判断,这种情况恨不得单独把代码抽出去写成方法,看起来稍微舒服一些(其实这种情况使用策略模式是非. 阅读详情

相关推荐

【设计模式】SpringBoot优雅使用策略模式

本篇文章主要会描述SpringBoot与策略模式的结合使用,因为不涉及到理论部分,所以在阅读本篇之前,需要对策略模式的理论已经有了一个基本的了解。通过Spring获取接口的实现,并解析实现类上的注解的方式,可以在程序启动时动态的将策略注入到一个Map中,作为策略的容器。使用时传入标识符就可以获取到对应的策略执行了。

积木成林,聚沙成塔 1万+

Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈

Titans 是谷歌推出的新型神经网络架构,通过神经长期记忆模块突破 Transformer 在处理长序列数据时的瓶颈,支持并行计算,显著提升训练效率。

士多啤梨先生の博客 994

SpringBoot实现策略模式

传统的实现方式,通过传统if代码判断。这样就会导致后期的维护性非常差。当后期需要新增计费方式,还需要在这里再加上if(),也不符合设计模式的开闭原则。策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。策略模式定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。

weixin_51833408的博客 2940

离散数学期末复习笔记【精华版】

文章目录前言一、????理逻辑1. 命题逻辑2. 等值演算3. 主合取范式、主析取范式4. 【题】推理证明5. 辖域、自由变元、约束变元二、????合1. 环和、环积,幂集,笛卡尔乘积三、 ????????关系1. 自反、对称、传递2&3. 合成运算,逆关系、闭包4. 哈斯图、上下界、偏序5. 等价关系、划分四、????1. 幺元(么元、单位元)、零元、逆元,半群、群、阿尔贝群、独异点、循环独异点2. 【题】由表判断3. 【题】证明五、????论1. 简单图、平凡图、多重图、子图、补图、出度、入度、

林大夕可的博客 17万+

四足机器人机械结构设计:从腿型到驱动的全面解析

本文全面解析了四足机器人机械结构设计的核心要点。资深工程师老张深入探讨了并联腿与串联腿的选型策略、不同腿型布局对稳定性的影响,并详细对比了皮带轮与连杆驱动方式的优劣。文章结合实战经验,强调了足端设计、材料选择及整体结构轻量化等关键细节,为机器人开发者提供了从理论到实践的宝贵指导。

assembly8low的博客 634

Spring Boot 项目中实现策略模式

策略模式是一种行为模式,可以替代大量if-else,使自己的代码更加优雅,更加容易进行扩展和兼容处理,可以帮我们解决具有同类但是行为有异的问题。使用策略模式可以把if-else语句很好的优化掉,大量的if语句的使用会让代码难以扩展和维护,使用策略模式可以很好的满足隔离性和扩展性,可以应对更多易变的需求。github项目链接。

weixin_42029738的博客 1207

Labview执行adbshell操作

一、目录 1、实现思路 2、adbshell工具配置 3、Labview执行命令窗口 1、实现思路 使用Labview的优点: 1、可以配合电源系统或者调用其他接口工具实现更高程度的自动化测试; 2、直接执行Linux相关命令,编写相关执行顺序或者逻辑更简易; --------可以用adbpush命令将.sh的脚本文件推入控制器内部执行; 3、Ubuntu系统比较大,如果只是日常执行脚本测试还是比较占用磁盘空间; 2、adbshell工具配置 1)下载adbshell工具; adbshell工具下载链

zataji的博客 2055

SpringBoot日常:策略模式应用

对于很多程序员,平时写代码为了方便,可能一股脑就按面向过程那样一下把业务逻辑编写下来,少有会去额外思考设计模式或者算法。这种情况其实不利于我们的编码维护,在本文,将介绍设计模式中的策略模式,通过本文的介绍将帮助你快速理解和应用。策略模式是一种行为型设计模式,它通过暴露一个统一的接口,通过该接口在不同情况下根据类型执行不同的逻辑的行为。策略模式解决了在有多种算法相似的情况下,使用“if…else”所带来的复杂和难以维护的问题。

qq_32590535的博客 2896

xilinx zynq-7000 linux下rs422串口通信测试步骤

这几天使用xilinx的zynq-7000系列调试rs422串口,期间遇到不少问题,好在最终调试完成,在这里记录一下调试步骤。 我用的soc型号是xc7z100,板载了2个rs422外设,PS端有2个uart控制器,uart0用于连接rs232并作为console控制台输出,uart1连接rs422。 rs422和主板连线原理图如下: 其中422_TXD1_3V3 和422_RXD1_3V3 为数据发送和接收引脚,422_TXD_DE1_3V3为发送使能引脚,422_RXD_REn1_...

dongyunke的博客 5907

干货|C#上位机与西门子PLC的Profinet协议通信开发(工控机版)

文章摘要: Profinet是西门子主导的工业以太网协议,支持实时通信(RT/IRT),广泛应用于PLC与工控机通信。本文聚焦C#上位机通过S7协议(集成于Profinet接口)高效访问西门子PLC(S7-1200/1500等),提供完整开发方案: 协议基础:解析Profinet三层架构(TCP/IP层、实时层、应用层),对比S7协议优势(开发便捷、跨平台); 开发实践:基于S7NetPlus/Snap7库实现数据读写,涵盖DB块、I/O点等地址规则; 环境配置:工控机(Windows/Linux/统信UO

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1215

spring boot学习

设计模式

费马程序猿的博客 93

面向 ABAP 开发者的 Joule 实战:把 AI 带进 Eclipse 的每一次敲键

本文介绍了SAP推出的ABAP开发AI工具套件Joule for developers,重点解析了其代码补全、自然语言对话、代码解释、测试生成等功能如何融入ABAP Cloud开发全流程。文章提供了具体的使用场景和操作示例,包括RAP应用开发中的建模辅助、代码理解、测试生成等环节,并分享了实用的提示词模板。同时强调了启用授权等实施细节,帮助开发者将AI能力转化为实际生产力而非演示效果。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 462

【设计模式】基于SpringBoot实现的策略模式

策略模式 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 我自己的理解就是通过接口实现不同的方法,同时又可以根据自己的选择自动选择使用哪个接口的实现。 情境: 某客户需要订购多个资源,每一个资源在不同的资源池下面,不同的资源池下面的资源又是不同的。由于不想使用多个if else来判断用户选择的资源池来进行资源的选择,所以使用...

弱水提沧的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式之基于SpringBoot项目实现策略模式

2)

huangeight的博客 563

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

# SpringBoot 中设计模式的使用

SpringBoot 中设计模式的使用 友情链接:设计模式的使用:https://blog.youkuaiyun.com/qq_37248504/article/details/122991309 简单工厂 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 SpringBoot中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 BeanFactory 类图 实现较为简单

不积跬步,无以至千里;不积小流,无以成江海 6200

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java 设计模式——策略模式:从 3 种写法到 SpringBoot 进阶

摘要 策略模式是一种解决"算法多样化且频繁切换"问题的设计模式,通过抽象定义、具体实现和工厂调度的三层结构实现解耦。文章对比了传统if-else写法的弊端(违反开闭原则、代码臃肿等),提出策略模式的核心价值在于避免硬编码,使代码更易扩展维护。在实战部分,介绍了三种实现方式,重点展示了非Spring项目下通过Map手动组装策略的完整代码示例,包括策略标识枚举定义、抽象接口设计和具体策略实现(如支付宝、微信支付)。策略模式特别适用于支付方式选择等需要动态切换业务逻辑的场景。

qq_46601365的博客 1491

springboot实现设计模式- 策略模式

在设计模式中除去工厂单例等, 策略模式 应该算最常用的设计模式之一 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装...

Faylinn的博客 6308

策略模式(什么是策略模式、策略模式的应用场景、策略模式的优点和缺点、策略模式在项目中的应用)

策略模式(什么是策略模式、策略模式的应用场景、策略模式的优点和缺点、策略模式在项目中的应用)

聂可以的博客 2366

【设计模式】模板方法与策略模式的结合使用

模板方法是一种非常简单的设计模式,只要能够理解面向对象中的继承与多态就能够理解这种设计模式,我们可以在很多的框架源码中找到它的身影。同时在我们的日常开发中,它一般是用在同类型且不同实现方式的业务逻辑中,抽取公共逻辑,简单的说就是,模板方法经常和策略模式结合使用。《SpringBoot优雅使用策略模式》本篇文章介绍了什么是模板方法、模板方法的简单实现与在SpringBoot中的实现的。然后对比了模板方法与策略模式的类图,发现两者天然就可以结合在一起使用。最后,通过代码实现验证了两者结合使用的可行性。

积木成林,聚沙成塔 4186

在SpringBoot项目中策略模式的使用

本文展示了如何使用策略模式重构考试场次更新逻辑。原始代码采用冗长的条件判断来更新不同字段,而重构后通过策略模式将每个字段的更新逻辑封装为独立策略类(如ExamNameUpdateStrategy、ExamDurationUpdateStrategy等)。这些策略类实现统一的UpdateExamStrategy接口,负责处理特定字段的更新及可能的级联更新。重构后的代码结构更清晰,职责更单一,便于扩展新字段的更新逻辑,同时避免了原始代码中重复的条件判断和维护困难的问题。策略模式的引入提高了代码的可读性和可维护性

m0_63949203的博客 916

SpringBoot中使用策略模式

策略模式是一种行为型设计模式,它定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换或独立于使用它的客户而变化。这种类型的设计模式属于行为型模式。当在处理一项业务时,如果有多种处理方式,并且需要再运行时决定使用哪一种具体实现,就会使用策略模式。策略模式的主要组成部分包括抽象策略(Strategy)类、具体策略(Concrete Strategy)类和环境(Context)类。抽象策略类是策略接口,定义了所有支持的算法;具体策略类是实现了抽象策略接口的类,表示每种具体的算法;

qq_42439945的博客 1477

一文搞懂设计模式—策略模式

在软件开发中,经常会遇到需要根据不同的条件来实现不同行为的场景。这种场景下,策略模式(Strategy Pattern)就是一种非常有用的设计模式

BookSea的博客 1652

SpringBoot中策略模式使用

本文介绍了在SpringBoot中应用策略模式处理多类型点位数据查询的实现方案。通过定义点位类型枚举和抽象基类,构建了防火点、水源点等实体类的继承体系。核心设计包括:1)策略工厂维护类型与策略的映射关系;2)策略接口统一数据操作方法;3)具体策略实现类处理各类型业务逻辑。这种设计有效避免了if-else分支泛滥,使系统具备良好的扩展性,新增点位类型时只需添加对应策略类即可,符合开闭原则。文章提供了完整的代码示例,包括枚举定义、实体类结构、服务接口及策略实现等关键部分,可作为策略模式在SpringBoot项目

盹猫的博客 7852

Springboot中使用策略模式替代If-Else分支

一、项目中常用的if-else分支语句的分析: 1、项目中我们可不可以使用if-else分支,该怎么使用才能使程序最优,维护起来更加的方便?首先项目中可以使用if-else分支,可以使程序通俗易懂。但是面对太多的分支或者逻辑稍微复杂的代码块,if-else分支不免显得优点乏力,在C++中貌似超过200个分支就会编译错误,在实际的交易系统中随着业务的增加,交易数会突破200+这个时候就会带来一些问题;其次,业务逻辑层等比较抽象的地方使用冗长的if else不好;同时,if-else代码违反了 open c.

ustcgdd的博客 1997
上一篇: 错误:org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded
下一篇: Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '...
菩提树下的丁春秋
博客等级 码龄8年 18粉丝 336原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值