java设计模式学习之【策略模式】
文章目录
- 引言
- 策略模式简介
- 定义与用途
- 实现方式
- 使用场景
- 优势与劣势
- 在Spring框架中的应用
- 计算示例
- 代码地址
引言
设想你正在玩一个策略游戏,每一个决策都会导致不同的游戏结局。同样地,在软件开发中,我们常常需要根据不同的场景或条件选择不同的算法或业务逻辑。硬编码所有可能的选项不仅会导致代码冗长,还会使得未来的改动变得异常困难。策略模式提供了一种方法,使得算法可以在运行时被动态选择,这样一来,我们就可以根据当前的需求灵活地替换算法,提高了代码的可维护性和扩展性。
策略模式简介
定义与用途
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
实现方式
实现策略模式通常涉及定义策略接口,编写一系列实现此接口的具体策略类,并通过一个上下文类来使用这些策略。
这种模式涉及到三个角色:
- 上下文(Context):持有一个策略类的引用,用来动态设置具体策略类。
- 策略接口(Strategy):定义所有支持的算法的公共接口。
- 具体策略(Concrete Strategy):实现策略接口的类,提供具体的算法实现。
使用场景
策略模式适用于以下场景:
- 当你有许多类似的类,但它们的行为有所不同时。
- 当你想让客户端知晓算法或对象的使用细节时。
- 当一个类定义了多种行为,而且这些行为在这个类的操作中以多个条件语句的形式出现时。
例如:
- 支付方式选择:在线购物平台支持多种支付方式,如信用卡、PayPal或比特币。策略模式允许用户选择最适合的支付策略。
- 数据压缩工具:一款软件可能支持不同的数据压缩算法,如ZIP、RAR或7z。用户可以根据需要选择最合适的压缩策略。
- 路由算法:导航软件中,根据当前交通状况选择最快、最短或避开拥堵的路线。
优势与劣势
- 优势
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了替换继承的方法来实现多种算法或行为的变化。
- 策略模式可以提供相同行为的不同实现。
- 劣势
- 客户端必须了解不同的策略。
- 策略模式和工厂模式结合时,代码可能变得更复杂。
在Spring框架中的应用
在Spring框架中,策略模式被广泛应用于各种场景,利用其灵活性和扩展性来处理不同的业务逻辑和算法选择。以下是Spring框架中体现策略模式概念的一些方面:
1. Spring Security的认证策略
在Spring Security中,策略模式被用来管理不同的认证机制。例如,开发者可以选择或自定义不同的认证策略,如HTTP基本认证、表单认证、LDAP认证等。每种认证方式都是一个策略,而Spring Security提供了一个统一的上下文来管理这些策略,使得可以轻松切换或扩展新的认证方式。2. Spring MVC中的视图解析策略
Spring MVC框架支持多种视图解析策略,以适应不同的视图技术,包括JSP、Thymeleaf和FreeMarker等。通过配置不同的视图解析器,开发者可以根据特定需求选择不同的渲染技术。每个视图解析器都遵循策略接口,Spring MVC通过统一的方式处理视图解析,无需关心具体的解析细节。3. 事务管理策略
Spring提供了灵活的事务管理策略,允许开发者根据需要选择不同的事务管理器。例如,可以根据具体的数据库或JPA提供者选择合适的事务管理器。每种事务管理器都实现了Spring的事务管理接口,为不同的存储选项提供了统一的事务操作方法。4. Spring Core的资源访问策略
Spring框架支持多种方式来访问资源,如通过文件系统、类路径和URL等。Spring提供了一个统一的资源接口,而具体的资源访问方式则通过不同的实现来完成。这允许开发者在不同的环境和需求下灵活选择最适合的资源访问策略。
计算示例
这个示例演示了策略模式在Java中的实现。策略模式是一种行为设计模式,允许在运行时选择最适合的算法或行为。
步骤 1:创建接口
public interface Strategy {public int doOperation(int num1, int num2);
}
Strategy 接口定义了一个 doOperation 方法,所有具体策略类将实现这个接口,以提供具体的操作。
步骤 2:创建实现相同接口的具体类
public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}
OperationAdd 是一个具体的策略类,实现了加法操作。
public class OperationSubstract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}
OperationSubtract 是另一个具体的策略类,实现了减法操作。
public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}
OperationMultiply 是第三个具体的策略类,实现了乘法操作。
步骤 3:创建上下文类
public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}
Context 类持有一个策略对象的引用,并允许客户端通过构造器设置其策略。它提供了一个 executeStrategy 方法,用于执行策略并返回结果。
步骤 4:使用上下文来看到策略改变时的行为变化
public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}
这个示例演示了策略模式如何使对象的行为可以根据所使用的策略动态改变。通过将每个算法封装在单独的类中,我们可以很容易地增加新的策略或改变现有策略,同时保持算法的独立性和上下文类的一致性。
代码地址
23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern
相关文章:
java设计模式学习之【策略模式】
文章目录 引言策略模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用计算示例代码地址 引言 设想你正在玩一个策略游戏,每一个决策都会导致不同的游戏结局。同样地,在软件开发中,我们常常需要根据不同的场景或条件选择不同…...
Mybatis SQL构建器类 - SqlBuilder and SelectBuilder (已经废弃)
在3.2版本之前,我们采用了一种略有不同的方法,通过利用ThreadLocal变量来掩盖一些使Java DSL有点繁琐的语言限制。然而,这种方法现在已被弃用,因为现代框架已经普及了使用构建器模式和匿名内部类的概念。因此,SelectBu…...
【Linux】不常用命令记录
查看开启的网络端口 1、使用netstat命令“netstat -tuln”,该命令将显示所有当前监听的TCP和UDP端口; 2、使用ss命令“ss -tuln”,用于显示当前监听的TCP和UDP端口; 3、使用lsof命令“lsof -i”,将显示当前打开的网络…...
【docker】安装docker环境并启动容器
一、安装docker 这里以centos系统为例安装docker环境 # 删除已有安装包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils # 设置源 y…...
AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)案例分享
原作者:擎创科技产品专家 布博士 案例分享 所需要的软件列表 本次案例的实现,全部采用开源或SAAS的产品来提供,并不涉及到私有化部署的软件产品。软件列表如下所示,如何申请apikey请自行研究,在这里不再详细说明&…...
【ESP32接入国产大模型之文心一言】
1. 怎样接入文心一言 随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。在这个领域中,文心一言作为一款强大的自然语言处理工具,具有许多重要的应用价值。本文将重点介绍如何通过ESP32接入国产大模型之文心一言api&am…...
保湿剂,预计2026年市场规模将达到约230亿美元
全球市场分析 从全球市场来看,保湿剂市场规模正在快速增长。主要集中在欧美和亚太地区的市场,据市场调研机构的数据显示,预计2026年,全球保湿剂市场规模将达到约230亿美元。保湿剂的应用领域不断拓展,包括从化妆品到个…...
CodeWhisperer:编码世界中的声音启迪者
人烟 导语: 在数字化时代,编码已经成为了一种不可或缺的技能。而 CodeWhisperer(编码世界中的声音启迪者)则以其卓越的技术和深厚的知识为人们带来了独特的启发和指导。本文将介绍 CodeWhisperer 的背景和成就,探讨他是…...
golang学习专栏
GOLANG专栏 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教程 MySQ…...
el-table表格动态添加列。多组数据拼接和多层级数据的处理
提示:el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中,为避免闪屏,可以表格数据统一渲染总结 前言 需求:富文本编辑器 一、多组数据拼接 <template><div class"test">…...
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建安装thinkphp6漏洞信息配置 漏洞利用 修复建议 漏洞名称 漏洞描述 2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文…...
短说社区运营的使用工具分享(一)
本文是一篇针对短说社区运营的使用工具分享帖,是小编结合日常使用,总结的一些可以帮助网站管理员和运营人员进行日常操作和管理的工具。 1. 想天工作台之运营面板 想天工作台可以将桌面划分不同的类型来辅助办公,我分享下我当前的桌面情况&…...
关于.gitignore文件
.gitignore文件用于忽略git同步文件。 git上创建项目时,默认的.gitignore文件配置比较少,不太适合于windows下vs的开发设置。 下面是vs中.gitignore条目样例: # Prerequisites *.d# Compiled Object files *.slo *.lo *.o *.obj*.iobj *.V…...
Cell 文章图复现
多组差异火山图复现 参考文章: A Spatiotemporal Organ-Wide Gene Expression and Cell Atlas of the Developing Human Heart Figure 2. H 图里主要是单细胞数据不同cluster之间的差异火山图, 所以说白了就是散点图和柱状图的结合, 散点图用差异基因绘制, 柱状图利用logFC最…...
只需一招彻底解决SOLIDWORKS不显示缩略图预览
SOLIDWORKS缩略图能够让工程师便于识别想要打开的模型,但经常会有用户遇到在资源管理器中查看SOLIDWORKS文件时,仅显示SOLIDWORKS的图标,而没有相关文件的预览缩略图。 Windows文件夹选项设置 首先确保Windows文件夹选项设置,显…...
nccl 源码分析 从 ncclAllReduce 的执行开始认识nccl源代码
文字没有提及的代码内容,不需要太在意,当然也可以瞟两眼; 首先,总体而言函数 ncclAllReduce 的功能在于将携带了一个操作的info结构体,放入了队列中,待后面执行; 排队的函数调用是 ncclEnqueue…...
仿照AirDrop(隔空投送)优雅地在局域网中传输文件
基于WebRTC的局域网文件传输 在前一段时间,我想在手机上向电脑发送文件,因为要发送的文件比较多,所以我想直接通过USB连到电脑上传输,等我将手机连到电脑上之后,我发现手机竟然无法被电脑识别,能够充电但是…...
【PHP】TP5.0及Fastadmin中将查询数据返回对象转为数组
目录 方法一:使用collection助手函数 方法二:设置返回数据集的对象名 在 ThinkPHP 5.0 中,对模型查询返回的对象进行了优化,默认情况下,使用 all 或 select 方法查询数据库将返回一个对象数组集合。这个集合是模型的…...
大公司里怎样开发和部署前端代码?
前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 昨天的时候有同学问到前端部署相关的内容,正好在知乎中看到…...
API接口:原理、设计与实践
一、引言 随着互联网的发展,应用程序之间的交互变得越来越频繁,API接口成为了不同应用程序之间进行数据交换的重要手段。本文将详细介绍API接口的原理、设计与实践,以期帮助读者更好地理解和应用这一技术。 二、API接口概述 API࿰…...
2023年TIOBE指数TOP50的编程语言写“Hello World!”
这篇文章列出了TIOBE指数TOP50的编程语言(TIOBE Index - TIOBE)如何写“Hello World!”。“Hello World!”代码应该是每个程序员学习一门编程语言最先实现的程序,给我们带来了很多美好的回忆,下面我们就一次…...
spring、springmvc、springboot、springcloud简介
spring简介 spring是什么? spring: 春天spring: 轻量级的控制反转和面向切面编程的框架 历史 2002年,首次推出spring雏形,interface 21框架2004年,发布1.0版本Rod Johnson: 创始人,悉尼大学,音乐学博士…...
立仪科技光谱共焦位移传感器:应用领域的广泛性
在科技日新月异的今天,光谱共焦位移传感器以其精确、稳定的特性,在各个领域得到了广泛的应用。本文将详细介绍光谱共焦位移传感器的应用情况,以期让大家对其有更深入的了解。我们来理解一下什么是光谱共焦位移传感器。 它是一种通过测量物体表…...
neo4j图数据库安装和测试
neo4j图数据库安装和测试 1. 下载合适的neo4j软件版本。 https://we-yun.com/doc/neo4j/ https://neo4j.com/deployment-center/#enterprise 2. 下载JAVAJDK 由于neo4j是一个用Java编写的图形数据库,因此在安装和运行Neo4j之前,需要先安装Java Developm…...
爬取豆瓣电影top250的电影名称(完整代码与解释)
在爬取豆瓣电影top250的电影名称之前,需要在安装两个第三方库requests和bs4,方法是在终端输入: pip install requestspip install bs4 截几张关键性图片: 豆瓣top250电影网页 运行结果 测试html文件标签的各个方法的作用…...
tidb 集成 flyway 报错 denied to user for table global_variables
报错内容: Caused by: java.sql.SQLException: connection disabled at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:1181) at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.jav…...
很实用的ChatGPT网站—在线编程模块增补篇
很实用的ChatGPT网站(http://chat-zh.com/)——增补篇 今天介绍一个好兄弟开发的ChatGPT网站,网址[http://chat-zh.com/]。这个网站功能模块很多,包含生活、学习、医疗、法律、经济等很多方面。今天跟大家分享一下,新…...
A股风格因子看板 (2024.01第01期)
该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第1期,指数组合数据截止日2024-12-01,要点如下 近1年A股风格因子检验统…...
基于gamma矫正的照片亮度调整(python和opencv实现)
import cv2 import numpy as npdef adjust_gamma(image, gamma1.0):invGamma 1.0 / gammatable np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")return cv2.LUT(image, table)# 读取图像 original cv2.imread("tes…...
LeetCode-Java(29)
29. 两数相除 结果肯定落在dividend上,于是对这个区间每一个数进行二分查找,判断方法就是 while (l < r) {long mid l r 1 >> 1;if (mul(mid, y) < x) {l mid;} else {r mid - 1;}} 其中mul是一个要定义的快速乘法。 完整代码如下 …...
微信审批小程序/seo是什么服务
本文为美国俄亥俄州立大学(作者:Christine Ann Bryant)的硕士论文,共97页。 本文研究了在单接收机数据速率有限的情况下,实现多输入单输出(MISO)合成孔径雷达(SAR)空时自…...
wordpress建站主题/百度搜索官网
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1466 Accepted Submission(s): 853 Problem Descriptionm堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出…...
做网站总费用/搜索引擎优化学习
[Problem] USACO 1.1.2 - Greedy Gift Givers [URL] http://ace.delos.com/usacoprob2?aS95TFRgcK4B&Sgift1 [General Description] 有一群朋友要互送礼物。他们每个人都准备了钱用来送礼,并且这些钱将会被平均用于那些将要收到他的礼物的人。然而在这群人中&a…...
adsl 网站服务器/谷歌play商店官网
。。。。。。。。。。。。转载于:https://www.cnblogs.com/xyp666/p/9246744.html...
哪个地方网站建设的公司多/网站制作400哪家好
Genesis 取自圣经 4:1 有一日,那人和他妻子夏娃同房。夏娃就怀孕,生了该隐(就是得的意思),便说,耶和华使我得了一个男子。 4:1 And the man had connection with Eve his wife, and she became with chi…...
建设手机网站/百度客户端官网
相信钓鱼邮件对于邮件管理员都不陌生,诸如此类那么怎么才能杜绝此类邮件呢?这里简单新建一条规则命名为 钓鱼邮件, 只要是包含 “升”“邮”“箱”“配”“额”这几个字的,统统重定向给管理员,并追加 Cheat Mail &…...