当前位置: 首页 > news >正文

Java设计模式之策略模式

1. 策略模式介绍

1、根据它来避免 if-else 或 switch 分支判断,避免使用多重条件转移语句;
2、支持“开闭原则”,可以在原有基础上选择行为方法,同时允许增加行为方法。

2. 策略模式结构类

① 接口或抽象类:自定义接口或抽象类,由多个实现类具体实现;
② 抽象方法:实现类中可以继承或重写它;
③ Bean实例:Spring提供注入ApplicationContext即应用上下文接口获取;通过不同BeanName(JDK提供的@Resource依赖注入原理)实现分支判断转移语句。

3.策略模式代码案例

一、首先定义枚举类,通过name绑定BeanName

public enum ServicesNameEnum {CONSUMER_MEMBER("consumerMember", "consumerMemberService"),CONSUMER_USERINFOS("consumerUserInfos", "consumerUserInfosService");private final String name;private final String beanName;ServicesNameEnum(String name, String beanName) {this.name = name;this.beanName = beanName;}/*** 通过name获取IOC中对象实例** @param name* @return*/public static String getBeanNameByName(String name) {for (ServicesNameEnum servicesNameEnum : ServicesNameEnum.values()) {if (servicesNameEnum.getName().equals(name)) {return servicesNameEnum.getBeanName();}}return name;}public String getName() {return name;}public String getBeanName() {return beanName;}
}

二、定义接口

public interface IConsumerService {List<UserInfo> findUserInfos(String authority);List<Order> findOrders(List<Long> orderIds);String insertMember(Member member) throws Exception;void insertUserInfo(UserInfo userInfo);void process(UserInfo userInfo);}

三、第一个接口实现类

@Service
public class ConsumerMemberService implements IConsumerService {@Overridepublic List<UserInfo> findUserInfos(String authority) {System.out.println("ConsumerMemberService开始执行----------------------------");return null;}@Overridepublic List<Order> findOrders(List<Long> orderIds) {System.out.println("ConsumerMemberService开始执行----------------------------");return null;}@Overridepublic String insertMember(Member member) throws Exception {return null;}@Overridepublic void insertUserInfo(UserInfo userInfo) {}@Overridepublic void process(UserInfo userInfo) {}}

四、第二个接口实现类

@Service
public class ConsumerUserInfosService implements IConsumerService {@Overridepublic List<UserInfo> findUserInfos(String authority) {System.out.println("ConsumerUserInfosService开始执行----------------------------");return null;}@Overridepublic List<Order> findOrders(List<Long> orderIds) {System.out.println("ConsumerUserInfosService开始执行----------------------------");return null;}@Overridepublic String insertMember(Member member) throws Exception {return null;}@Overridepublic void insertUserInfo(UserInfo userInfo) {}@Overridepublic void process(UserInfo userInfo) {}}

五、依赖注入ApplicationContext容器对象,根据BeanName获取具体对象实例

 	@Autowiredprivate ApplicationContext applicationContext;@RequestMapping(value = "/getInstanceByBeanName",method = RequestMethod.GET)public void getInstanceByBeanName(String name) {// 获取namename = "consumerUserInfos";// name绑定BeanNameString beanName = ServicesNameEnum.getBeanNameByName(name);// ApplicationContext即应用上下文通过BeanName获取具体对象实例(JDK提供的@Resource原理)// IConsumerService 为接口或抽象类并且多个实现类;最终实例对象由beanName决定IConsumerService iConsumerService= (IConsumerService) applicationContext.getBean(beanName);// 多态;最终调用实现类的重写方法iConsumerService.findUserInfos(null);}

六、控制台执行结果

ConsumerUserInfosService开始执行----------------------------

相关文章:

Java设计模式之策略模式

1. 策略模式介绍 1、根据它来避免 if-else 或 switch 分支判断&#xff0c;避免使用多重条件转移语句&#xff1b; 2、支持“开闭原则”&#xff0c;可以在原有基础上选择行为方法&#xff0c;同时允许增加行为方法。 2. 策略模式结构类 ① 接口或抽象类&#xff1a;自定义接口…...

IPv4分组

4.3.1 IPv4分组 IP协议定义数据传送的基本单元——IP分组及其确切的数据格式 1. IPv4分组的格式 IPv4分组由首部和数据部分&#xff08;TCP、UDP段&#xff09;组成&#xff0c;其中首部分为固定部分&#xff08;20字节&#xff09;和可选字段&#xff08;长度可变&#xff0…...

Jmeter常用功能-参数化介绍

JMeter也有像LR中的参数化&#xff0c;本篇就来介绍下JMeter的参数化如何去实现。 参数化&#xff1a;录制脚本中有登录操作&#xff0c;需要输入用户名和密码&#xff0c;假如系统不允许相同的用户名和密码同时登录&#xff0c;或者想更好的模拟多个用户来登录系统。 这个时…...

“深入探索JVM内部机制:解密Java虚拟机的工作原理“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解密Java虚拟机的工作原理 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;解密其工作原理。我们将介绍JVM的基本组成部分、类加载过程、内存管理和垃圾回收、即时编译器等关键概…...

C++超基础语法

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…...

位运算相关题目:下一个数、整数转换、配对交换

题目1&#xff1a;下一个数 给定一个正整数&#xff0c;找出与其二进制表达式中1的个数相同且大小最接近的那两个数&#xff08;一个略大&#xff0c;一个略小&#xff09;。 示例&#xff1a; 输入&#xff1a;num 2&#xff08;或者0b10&#xff09; 输出&#xff1a;[4,…...

【数据结构】链表常见题目

文章目录 链表合并两个有序链表反转链表复制带随机指针的链表环形链表环形链表II相交链表移除链表元素链表中倒数第k个节点链表分割链表的回文结构链表的中间节点旋转链表链表排序链表求和 (逆序求)链表求和II (正序求)重排链表奇偶链表反转链表II <==> 链表内指定区间反…...

多家企业加入即将在2024年发射的量子卫星SpeQtral-1任务

近日&#xff0c;总部位于新加坡的量子通信技术公司SpeQtral宣布将与纳米航空电子公司NanoAvionics和卫星光子学公司Mbryonics合作执行即将到来的SpeQtral-1量子密钥分发&#xff08;Quantum Key Distribution, QKD&#xff09;卫星任务。NanoAvionics被选为卫星平台提供商&…...

shell脚本基础

目录 前言 一、概述 &#xff08;一&#xff09;、shell脚本基础概念 &#xff08;二&#xff09;、shell的类型 二、Shell变量 &#xff08;一&#xff09;、组成 1.变量名 2.变量值 &#xff08;二&#xff09;、类型 1.系统内置变量&#xff08;环境变量&#xff09; 2.自定…...

创建maven的Springboot项目出现错误:Cannot access alimaven

创建maven的Springboot项目出现错误&#xff1a;Cannot access alimaven 1&#xff09;问题2) 分析问题3&#xff09;解决问题 1&#xff09;问题 创建maven的Springboot项目出现错误&#xff1a; Cannot access alimaven (http://maven.aliyun.com/nexus/content/groups/p…...

神经网络基础-神经网络补充概念-32-神经网络与大脑

概念 神经网络&#xff08;Neural Networks&#xff09;是受到生物神经系统启发而设计的机器学习模型&#xff0c;用于处理和学习复杂的数据模式。尽管神经网络的设计和工作原理与大脑有一些相似之处&#xff0c;但它们并不完全相同&#xff0c;以下是神经网络和大脑之间的一些…...

linux自动填充密码及提示信息

背景&#xff1a;需要自动创建nvc的登录密码 sudo apt-get install expect expect 是由Don Libes基于Tcl&#xff08;Tool Command Language &#xff09;语言开发的&#xff0c;主要应用于自动化交互式操作的场景&#xff0c;借助Expect处理交互的命令&#xff0c;可以将交互…...

IC设计中主要的EDA工具有哪些? (内附EDA虚拟机安装资源)

EDA工具的使用涵盖了芯片的功能设计、综合、验证、物理设计等环节&#xff0c;更是被称作“芯片设计的工作母机”。下面就来为大家具体介绍一下常见的EDA工具。&#xff08;需要EDA虚拟机安装资源文末可领取~&#xff09; 什么是EDA&#xff1f; EDA是电子设计自动化&#xf…...

Zabbix配置通用的TCP/IP:port监控项

我们经常的用接口&#xff0c;比如说FTP、HTTP、DNS、数据库接口&#xff0c;都可以用IP:PORT方式探测其是否存活&#xff0c;那么我们去繁就简&#xff0c;就简单监控一下IP&#xff1a;PORT吧&#xff01; 1、新建主机&#xff1a; 填入主机名称、群组、Agent可以不填&…...

【RocketMQ】SpringBoot集成RocketMQ

SpringBoot集成RocketMQ 首先依旧是引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version> </dependency>然后就可以编写发送不同类…...

思腾云计算

思腾合力受邀参加第七届世界智能大会&#xff0c;届时在会上展出思腾合力 AI 服务器。诚挚邀请与会者来思腾展位&#xff08;S10-B04&#xff09;参观与交流&#xff0c;领取七彩虹电竞机械键盘与鼠标、正版NVIDIA信仰尺、公牛魔方智能USB插座、超大桌面鼠标垫等精美礼品。 由天…...

前端面试:【HTML】语义化标签、表单、媒体元素

HTML&#xff08;超文本标记语言&#xff09;是构建网页内容的基础&#xff0c;它通过一系列标签来描述页面的结构和内容。在这篇文章中&#xff0c;我们将探讨HTML的基础知识&#xff0c;包括语义化标签、表单和媒体元素。 语义化标签&#xff1a;赋予内容更多意义 语义化标签…...

2024浙大MBA/MEM/MPA四个月冲刺备考策略

近期收到很多考生的咨询&#xff1a;距离联考就仅剩四个多月的时间&#xff0c;这个管理类联考的难度如何&#xff1f;主要考些什么内容&#xff1f;现在才开始备考还有希望上岸浙大吗&#xff1f;是不是要等到明年在开始备考比较合适&#xff1f;那么今天在这里小立老师就跟大…...

Element通过v-for循环渲染的form表单校验

需求&#xff1a;有个表单信息是v-for渲染的&#xff0c;例如下图&#xff0c;通过循环遍历实现新增和删除模块&#xff0c;按照平时的写法实现校验&#xff0c;是不能实现我们想要的效果&#xff0c;根据这个需求&#xff0c;我找到了一个解决方法 1.HTML <el-form ref&qu…...

精彩回顾 | 迪捷软件出席2023ATC汽车电子与软件技术周

2023年8月18日&#xff0c;由ATC汽车技术会议主办&#xff0c;上海市集成电路行业协会支持的“2023ATC汽车电子与软件技术周”在上海市圆满落幕。迪捷软件上海参展之行圆满收官。 ▲开幕式 本次峰会汇聚了整车厂、汽车零部件集团、软硬件方案提供商、软件工具供应商、软件测试…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...