策略模式--在SpringBoot中的使用

策略模式

  1. 策略模式主要分为三部分:
  • 抽象策略类AbstractStrategy:负责定义抽象方法,具体策略类的继承
  • 具体策略类ContentStrategy:负责策略类的具体实现
  • 上下文类:ContextStrategy:负责上游模块的调用。包含一个策略属性,一个调用方法

策略模式实现

抽象策略类

public Abstract class Animal{public abstract Object eat();
}

具体策略类

  • 可以有多个具体策略类
public class Cat extends Animal{@Overridepublic Object eat(){System.out.println("猫吃鱼");}
}

上下文类

public class Context{private Animal animal;public Context(String animalType){if(animalType.equals("cat"){this.animal=new Cat();}else if(){}}public Object invoke(){return animal.eat();}
}

使用

public static void main(String[] args) {Context context=new Context("cat");context.invoke();
}

SpringBoot中应用

  1. SpringBoot中,我们的具体策略类一般会通过@Autowired注入其他Bean来调用。这个时候使用上面的就无法使用了。我们要根据Spring的Bean特性获取Bean来实现
@Service
public class ContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {ContextUtil.applicationContext = applicationContext;}public static <T> T getBean(Class<T> clazz) {return applicationContext.getBean(clazz);}public static Object getBean(String name) {return applicationContext.getBean(name);}public static <T> T getBean(String name, Class<T> clazz) {return applicationContext.getBean(name, clazz);}}
  2. Context上下文通过枚举类+switch实现获取具体Bean
public enum Enum02 {SPRING("cat", "cat"), SUMMER("dog", dog);private String code;private String beanName;Enum02(String code, String beanName) {this.beanName = beanName;this.code = code;}public String getBeanName() {return beanName;}public int getCode() {return code;}public static Enum02 getEnum(String code) {Enum02[] enums = Enum02.values();for (Enum02 enu : enums) {if (enu.getCode().equals(code)) {return enu;}}return null;}
}
  1. 上下文使用
public class Context{private Animal animal;public Context(String animalType){Enum02 enum = Enum02.getEnum(animalType);switch(animalType){case "cat":this.animal=ContextUtil.getBean(enum.beanName);break;}}public Object invoke(){return animal.eat();}
}
  1. 使用时,只需要new Context,传入参数即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解java多态

目录 一、多态的概念 二、多态实现条件 三、重写 3.1重写概念 3.2重写规则 3.3重载和重写的区别&#xff1f;&#xff08;面试重点&#xff09; 四、静态绑定和动态绑定 五、 向上转移和向下转型 5.1 向上转型 5.2 向下转型 六、多态的优缺点 6.1使用多态的好处 6…

微信扫码进入小程序特定页面

小程序配置 开发 - 开发管理 - 开发设置-普通链接二维码打开小程序 配置好的截图 如下&#xff1a;二维码规则建议是自己的域名 /mini/ 功能页面 pages/index/index 是为了方便跳转其他页面 记得把校验文件发给后端 web 端处理 二维码格式为&#xff1a;二维码规则/功能页…

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言&#xff1a;经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参&#xff0c; 例如日常开发中 我们使用Objects.equals去比较 status(入参)&#xff0c;statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() &#xff0c;再比…

详解FreeRTOS:内存管理(高级篇—8)

目录 1、内存管理简介 2、什么是内存碎片 3、FreeRTOS内存管理方案 4、heap_1 内存管理方案

Oracle之 第三篇 PL/SQL基础

目录 Oracle之 第三篇 PL/SQL基础 PL/SQL程序块 PL/SQL语言 PL/SQL的基本结构 PL/SQL块分类 一、PL/SQL语言 二、PL/SQL 常量 、变量 合法字符 数据类型 LOB 数据类型 属性类型 运算符 常量 PL/SQL常量 1 、变量的声明 2、属性类型 % type 变量赋值 %type…

NR cell配置带宽时,如何设置carrierBandwidth?

NR中带宽在38.101中有规定。 如上是FR1 38.101-1中与带宽设定有关的table&#xff0c;协议中根据SCS规定的传输带宽和可以配置的RB 数如上表&#xff0c;也就是说在实网下或者lab测试配置带宽时要根据上表内容去配置&#xff0c;举例如下。 如上图分别是几种带宽的配置参数&…

Matlab绘制双纵轴图(yyaxis函数)

一、方法一yyaxis函数 x linspace(0,pi); y1 cos(x); yyaxis left; % 激活左边的轴 plot(x,y1) xlabel(X-axis); ylabel(left Y-axis); % 给左y轴添加轴标签hold on yyaxis right; % 激活右边的轴 y2 cos(2*x); plot(x,y2) ylim([-1,1]); % 设置右y轴的界限 ylabel(right Y…

【前端】前后端的网络通信基础操作(原生ajax, axios, fetch)

概述 前后端网络请求工具 原生ajaxfetch apiaxios GET和POST请求 get只能发纯文本 post可以发不同类型的数据&#xff0c;要设置请求头&#xff0c;需要告诉服务器一些额外信息 测试服务器地址 有一些公共的测试 API 可供学习和测试用途。这些 API 允许你发送 HTTP 请求…

24年全国31省份教师资格笔试报名时间汇总报名材料❗

✅教资报考必备材料&#xff1a;个人证件照、个人证件照材料、个人证件照。 &#x1f550;全国各地区报名时间汇总&#xff1a; 北京 1月12日-15日15:00 广东 1月12日9:30至15日16:00 山东 1月12日-15日15:00 江苏 1月12日-15日12:00 吉林 1月12日-15日16:00 四川 1月12日-15日…

私域新手必看:这可能是你最快速的入门指南!

一、认知层&#xff1a;为什么必须做私域&#xff1f; 了解这个问题&#xff0c;必须得观察一下中国现状。根据中国互联网络信息中心&#xff08;CNNIC&#xff09;发布第48次《中国互联网络发展状况统计报告》显示&#xff0c;截至 2021 年 6 月&#xff1a; 而典型电商平台的…

电口模块SFP-GE-T常见问题解答

电口模块SFP-GE-T是一种常见的网络设备&#xff0c;用于实现光电信号的转换。在使用电口模块SFP-GE-T的过程中&#xff0c;可能会遇到一些问题。本文将为您解答一些常见问题&#xff0c;并提供一些使用技巧。 一、电口模块SFP-GE-T怎么用&#xff1f; 使用电口模块SFP-GE-T的…

【手搓深度学习算法】用逻辑回归分类双月牙数据集-非线性数据篇

用逻辑回归分类-非线性数据篇 前言 逻辑斯蒂回归是一种广泛使用的分类方法&#xff0c;它是基于条件概率密度函数的最大似然估计的。它的主要思想是将输入空间划分为多个子空间&#xff0c;每个子空间对应一个类别。在每个子空间内部&#xff0c;我们假设输入变量的取值与类别…

2024年寒假即将来临 如何实现高质量亲子陪伴?

近日,各地陆续公布了寒假放假时间安排,孩子们期待着迎来一个休闲和轻松的假期。然而,对于许多家长来说,他们也意识到寒假不仅是一个放松的时间,更是一个增进亲子关系的宝贵机会,可以为孩子提供有意义的学习陪伴。 自“双减”政策落地后,学生的课业负担减轻许多,拥有了更多的空余…

vue3 组件内判断是从哪个页面过来的

setup中只有onBeforeRouteLeave、onBeforeRouteUpdate两个钩子函数&#xff0c;没有beforeRouteEnter对应的钩子函数&#xff0c;所以无法在setup中直接使用 <script setup> import { onBeforeRouteLeave, onBeforeRouteUpdate } from vue-router;onBeforeRouteLeave((t…

Java中String、StringBuffer和StringBuilder的区别

在Java中&#xff0c;String、StringBuffer和StringBuilder是用于处理字符串的类&#xff0c;它们之间有以下区别&#xff1a; String&#xff1a; String是不可变的&#xff0c;一旦创建就不能被修改。每次对String进行修改时&#xff0c;实际上都是创建了一个新的String对象…

【leetcode 2707. 字符串中的额外字符】动态规划 字典树

2707. 字符串中的额外字符 题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割…

Go 如何处理死锁以提供哪些工具来检测或防死锁?

并发是 Go 的核心特性&#xff0c;它使程序能够同时处理多个任务。它是现代编程的一个强大组件&#xff0c;如果使用正确&#xff0c;可以产生高效、高性能的应用程序。然而&#xff0c;并发性也带来了顺序编程中不存在的某些类型错误的可能性&#xff0c;其中最臭名昭著的是死…

拼多多API的未来:无限可能性和创新空间

拼多多&#xff0c;作为中国电商市场的巨头之一&#xff0c;自成立以来一直保持着高速的发展态势。其API的开放为开发者提供了无限的可能性和创新空间&#xff0c;使得更多的商业逻辑和功能得以实现。本文将深入探讨拼多多API的未来发展&#xff0c;以及它所具备的无限可能性和…

面相圆润是有福气的象征

在中国传统文化中&#xff0c;面相是一个非常重要的概念。相信大家肯定听说过“相由心生”这个成语吧&#xff0c;这就是告诉我们&#xff0c;一个人的面貌其实是可以反映出他内心的状态和气质&#xff0c;也可以反映其性格、健康状况和运势等。而一个圆润的面相&#xff0c;则…

vue布局居中

要在Vue项目中实现居中布局&#xff0c;您可以使用以下方法&#xff1a; 方法一&#xff1a;使用flexbox布局 在父元素的样式中&#xff0c;添加display: flex;和justify-content: center;属性。 <template><div class"parent"><div class"chi…