策略模式实践

目录

前言

五个部分

名词解释

代码

controller层

HelloService接口

实现类

自定义注解

上下文

策略工厂

Java SPI配置  

验证


前言

五个部分

接口、实现类、自定义注解、上下文、策略工厂

名词解释

自定义注解(方便后期增加实现类后灵活控制策略)

上下文(初始化接口,进行数据承接)

策略工厂(利用java SPI使接口与实现解耦,并通过验证注解是否存在,调用不同的策略)

代码

controller层

package com.zsp.sheji.JavaSPI;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("hello")
public class HelloController {@PostMapping("/pay")public String pay(){PayContext payContext = new PayContext();payContext.setHelloService(PayFactory.makeHello("helloOne"));String result = payContext.sayHello("你好");return result;}
}

HelloService接口

package com.zsp.sheji.JavaSPI;public interface HelloService {String sayHello(String hello);
}

实现类

这里写了两个实现类,模拟真实环境中的不同策略调用

HelloOneServiceImpl

package com.zsp.sheji.JavaSPI;import org.springframework.stereotype.Service;@Pay(type = "helloOne")
@Service
public class HelloOneServiceImpl implements HelloService{@Overridepublic String sayHello(String hello) {return  hello + "=== one";}
}

HelloTwoServiceImpl

package com.zsp.sheji.JavaSPI;import org.springframework.stereotype.Service;@Pay(type = "helloTwo")
@Service
public class HelloTwoServiceImpl implements HelloService{@Overridepublic String sayHello(String hello) {return hello + "=== two";}
}

自定义注解

package com.zsp.sheji.JavaSPI;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pay {String type();
}

上下文

package com.zsp.sheji.JavaSPI;import org.springframework.stereotype.Component;@Component
public class PayContext {private HelloService helloService;public void setHelloService(HelloService helloService){this.helloService = helloService;}public PayContext(){}public String sayHello(String hello){// 上下文进行数据承接return this.helloService.sayHello(hello);}
}

策略工厂

package com.zsp.sheji.JavaSPI;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.ServiceLoader;public class PayFactory {private static Map<String,HelloService> helloMap = new HashMap<>();static {ServiceLoader<HelloService> load = ServiceLoader.load(HelloService.class);Iterator<HelloService> iterator = load.iterator();while (iterator.hasNext()) {HelloService next = iterator.next();Class<? extends HelloService> aClass = next.getClass();if (!aClass.isAnnotationPresent(com.zsp.sheji.JavaSPI.Pay.class)) {// 不存在添加进去throw new IllegalStateException("class: " + aClass + " expect @com.zsp.sheji.策略模式高级注解方式.PayType, but not found!");}helloMap.put(aClass.getAnnotation(Pay.class).type(), next);}}public static HelloService makeHello(String type){return helloMap.get(type);}
}

Java SPI配置  

文件名:com.zsp.sheji.JavaSPI.HelloService   对应接口的全限定类名

com.zsp.sheji.JavaSPI.HelloOneServiceImpl
com.zsp.sheji.JavaSPI.HelloTwoServiceImpl

项目结构

验证

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

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

相关文章

【RESTful API】RESTful接口设计练习

参考: BV1Ps4y1J7Ve ---------------------------------------------------------------------------------------------------------- 一、RESTful框架 常见的有SpringMVC,jersey,play 二、API测试工具 Postman,Insomnia 三、RESTful接口设计练习 3.1 项目准备 构…

【项目实战】SpringBoot连接openGauss

一&#xff1a;Docker安装openGauss 1.下载openGauss 安装好Docker好以后&#xff0c;执行如下命令下载openGauss3.0镜像。docker pull enmotech/opengauss:3.0.0 2.运行openGauss 执行如下命令docker run -itd --name opengauss \ --restartalways \ --privilegedtrue \ …

eNSP防火墙USG6000V使用Web界面登入教程

文章目录 登入流程1、下载USG6000V的镜像包2、导入USG6000V的镜像包3、配置防火墙web页面4、修改本机vmnet1网卡的ipv4地址5、在eNSP上添加云6、配置防火墙管理地址&#xff0c;开启http服务7、关闭电脑防火墙8、访问web页面 登入流程 1、下载USG6000V的镜像包 链接&#xff…

MySQL表连接

文章目录 MySQL内外连接1.内连接2.外连接&#xff08;1&#xff09;左外连接&#xff08;2)右外连接 3.简单案例 MySQL内外连接 1.内连接 内连接的SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下…

pytest-pytest-html测试报告这样做,学完能涨薪3k

在 pytest 中提供了生成html格式测试报告的插件 pytest-html 安装 安装命令如下&#xff1a; pip install pytest-html使用 我们已经知道执行用例的两种方式&#xff0c;pytest.main()执行和命令行执行&#xff0c;而要使用pytest-html生成报告&#xff0c;只需要在执行时加…

分布式运用之ELK企业级日志分析系统

1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引…

2023-简单点-机器学习中常用的特殊函数,激活函数[sigmoid tanh ]

机器学习中的特殊函数 Sigmoidsoftplus函数tanhReLu(x)Leaky-ReluELUSiLu/ SwishMish伽玛函数beta函数Ref Sigmoid 值域: 【0,1】 定义域&#xff1a;【负无穷,正无穷】 特殊点记忆&#xff1a; 经过 [0 , 0.5] 关键点[0,0.5]处的导数是 0.025 相关导数&#xff1a; softplu…

『VUE3 の 要点摘录』

✅v-model 用法 v-model 原生方法&#xff1a; v-model computed &#xff1a; 更改名字&#xff1a; 多个 v-model 绑定 处理 v-model 修饰符 ✅TS项目报错 1、TypeScript 错误 “Module ‘…index’ has no default export” // tsconfig.json {...."compilerOpt…

备份恢复作业

备份恢复作业&#xff1a; 异机恢复recover database报如下错误&#xff1a; archived log file name/oradata/arch/1_237_1151011666.dbf thread1 sequence237 archived log file name/oradata/arch/2_256_1151011666.dbf thread2 sequence256 unable to find archived log ar…

路径规划型线性dp

题目来源&#xff1a;acwing 275 传纸条 分析&#xff1a;这题和两人同时摘樱桃之类的题一样&#xff0c;一个人从左上角走到右下角&#xff0c;再从右下角走回左上角&#xff0c;相同地点的分数只能得一次&#xff08;或者不能走相同地点&#xff09;。这种题统一可以按照两…

大金仓数据库:kingbase学习

kingbase学习 1.简介2. 安装3. 基础使用3.1 客户端连接3.2 表数据测试3.2.1 建表创建字段备注 3.2.2 数据写入测试3.2.2 json测试3.2.2.1 json查询测试3.2.2.2 json修改测试3.2.2.3 json数据迁移测试 4.springboot实战4.1 maven依赖4.2 连接配置4.3 mybatis-plus测试4.4 liquib…

QTextEdit 是 Qt 框架中的一个小部件(Widget),用于显示和编辑多行文本内容

QTextEdit 是 Qt 框架中的一个小部件&#xff08;Widget&#xff09;&#xff0c;用于显示和编辑多行文本内容。 QTextEdit 提供了一个可编辑的文本区域&#xff0c;可以用于显示和编辑富文本或纯文本。它支持基本的文本格式设置&#xff08;如字体、颜色、样式等&#xff09;…

【AI认证笔记】NO.2人工智能的发展

目录 一、人工智能的发展里程碑 二、当前人工智能的发展特点 1.人工智能进入高速发展阶段 2.人工智能元年 三、人工智能高速发展的三大引擎 1.算法突破 2.算力飞跃 3.数据井喷 四、AI的机遇 五、AI人才的缺口 六、行业AI 人工智能算法&#xff0c;万物互联&#xff…

从家暴谈中国女性在社会中的艰难处境

1、引言 2023年8月17日&#xff0c;一部名叫《我经过风暴》的电影悄然上映&#xff0c;引发了我的诸多思考。我研究过很多类似的案例&#xff0c;例如2020年的“拉姆案”、2021年的“禹秀英案”、2022年的“西安家暴事件”、2023年的“重庆杀妻案”…等等。这一系列案件&#…

qInstallMessageHandler的学习

背景&#xff1a;需要做一个日志系统。 把信息重定向到txt文件中。 参考&#xff1a; QT 调试信息如何输出到文件&#xff08;qDebug/qWarning/qCritical/qFatal&#xff09;-CSDN博客 Qt 之 qInstallMessageHandler&#xff08;重定向至文件&#xff09;-CSDN博客 demo…

Python小技巧:探索函数调用为何加速代码执行

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python 作为一种解释型语言&#xff0c;其执行速度相对于编译型语言可能会较慢。然而&#xff0c;在Python中&#xff0c;通常观察到代码在函数中运行得更快的现象。这个现象主要是由于函数调用的内部优化和解释…

神器!使用 patchworklib 库进行多图排版真棒啊

如果想把多个图合并放在一个图里&#xff0c;如图&#xff0c;该如何实现 好在R语言 和 Python 都有对应的解决方案&#xff0c; 分别是patchwork包和patchworklib库。 推介1 我们打造了《100个超强算法模型》&#xff0c;特点&#xff1a;从0到1轻松学习&#xff0c;原理、…

整车测试中的UDS诊断

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务&#xff09;诊断协议是在汽车电子ECU环境下的一种诊断通信协议。这种通信协议被用在几乎所有由OEM一级供应商所制造的新ECU上面。这些ECU控制车辆的各种功能&#xff0c;包括电控燃油喷射系统&#xff0…

Week-T11-优化器对比试验

文章目录 一、准备环境二、准备数据三、搭建训练网络三、训练模型&#xff08;1&#xff09;VSCode训练情况&#xff1a;&#xff08;2&#xff09;jupyter notebook训练情况&#xff1a; 四、模型评估 & 模型预测1、绘制Accuracy-Loss图2、显示model2的预测效果 五、总结1…

域名与服务器负载均衡技术学习总结

域名与服务器负载均衡技术学习总结_域名负载均衡-CSDN博客 OSI七层网络模型和TCP/IP四层网络模型的异同_七层模型和四层模型的区别-CSDN博客