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{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

OperationAdd 是一个具体的策略类,实现了加法操作。

public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

OperationSubtract 是另一个具体的策略类,实现了减法操作。

public class OperationMultiply implements Strategy{
   @Override
   public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos7.9安装ftp服务(vsftpd)

准备工作 1、centos 卸载vsftpd 删除原有的vsftpd [rootlocalhost ~]# systemctl stop vsftpd [rootlocalhost ~]# rpm -aq vsftpd [rootlocalhost ~]# rpm -aq vsftpd [rootlocalhost ~]# vsftpd-2.0.5-16.el5_5.1 2、验证是否删除完成warning: /etc/vsftpd/user_list sa…

【管理】如何正确与员工沟通

目录 一、沟通5个层次二、沟通4个要素三、沟通5个技巧系列文章版本记录 一、沟通5个层次 1、我不说你不问距离 2、我问了你不说隔阂 3、我问了你说了尊重 4、你想说我想问默契 5、我不问你说了信任 二、沟通4个要素 1先讲对方想听的话 2再讲对方听得进的话 3然后讲你应该讲的话…

Windows 下用 C++ 调用 Python

文章目录 Part.I IntroductionChap.I InformationChap.II 预备知识 Part.II 语法Chap.I PyRun_SimpleStringChap.II C / Python 变量之间的相互转换 Part.III 实例Chap.I 文件内容Chap.II 基于 Visual Studio IDEChap.III 基于 cmakeChap.IV 运行结果 Part.IV 可能出现的问题Ch…

银河麒麟桌面版开机后网络无法自动链接

下载并上传nm_3.0.1-1kylin77_arm64.deb 包。 下载链接:链接: https://pan.baidu.com/s/1rGPD8qJfjRui6lCC6QjHVw?pwdeeaf 提取码: eeaf 使用管理员命令运行安装sudo dpkg -i nm_3.0.1-1kylin77_arm64.deb 然后运行重启网卡命令sudo systemctl restart NetworkM…

react / antd ProTable - 高级表格 合并行,子表头

ProTable - 高级表格 合并行,以及ProTable的用法 key React.key 确定这个列的唯一值,一般用于 dataIndex 重复的情况 dataIndex React.key | React.key[] 与实体映射的 key,数组会被转化 [a,b] => Entity.a.b valueType ProFieldValueType 数据的渲染方式,我们自带了一部…

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下,const描述的是运行时常量性,也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性,这是const关键字无法保证的。例如&am…

「许战海战略文库」佳隆股份:2亿级别的调味品公司如何应对增长难题

自2002年以来,佳隆食品逐步向集团化方向发展,2010年11月2日在深圳证券交易所成功挂牌上市。 2009年-2022年,公司营收增长并不明显,基本维持在2-3亿之间。尤其是2022年,营收出现亏损的情况,在运营和增长战略…

接口测试基础知识总结

一、HTTP 1、http请求头和响应头包含那些内容? 请求头信息 请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。 2、常用的请求报头如下: Accept:浏览器可接受的MIME类型。 l MIME用于设定某种扩展名的文件用哪种应…

静态S5在项目管理中的应用与案例分享

静态S5作为一种强大的数据分析工具,不仅在数据处理和可视化方面表现出色,还在项目管理中发挥着重要作用。本篇将通过实际案例分享,探讨静态S5在项目管理中的应用与优势。 一、静态S5在项目管理中的应用 项目进度管理:静态S5通过…

计算机网络 综合(习题)

【计算机网络习题】系列文章目录 计算机网络 第一章 绪论(习题) 计算机网络 第二章 计算机网络体系结构(习题) 计算机网络 第三章 应用层(习题) 计算机网络 第四章 运输层(习题) 计算机网络 第五章 网络层(习题) 计算机网络 第六章 数据链路层(习题) 计算机网络 第七章 物…

第三方软件测试机构可提供哪些服务类型?如何收费?

随着高新技术的快速发展,软件企业将测试工作交由第三方软件测试机构进行已经成为了行业趋势,因为企业自身的大多精力都投入在产品开发上,第三方软件测试机构的存在也就极大的提供了便利。 第三方软件测试机构是区别于软件企业与软件需求方的…

书客、孩视宝、明基护眼台灯好不好用?护眼灯测评对比!

现在一些家长对自家孩子的健康也是特别的重视,从小时开始的儿童枕;再到保护眼睛的护眼台灯、OK眼镜;再到青少年时期的生长激素...可以说是穷出不尽,但是关于孩子使用的东西又不能马虎,每次要帮孩子选东西的时候可是一阵…

《代码整洁之道之程序员的职业素养》-专业主义

专业主义有很深的含义,它不但象征着荣誉和骄傲,而且明确意味着责任和义务担当责任,“为了按时交付软件,没测例行程序,测试例行程序需要几个小时,当时必须交付软件,因为故障修复部分都不涉及例行…

在Docker中安装Tomact

目录 前言: 一.安装Tomact 查找指定的tomact版本 下载tomact9.0 查看该镜像是否安装成功 安装成功之后就开始运行镜像了 ps(用于列出正在运行的Docker容器) ​编辑 测试(虚拟机ip:8080) ​编辑 解决措施 ​编辑 完成以上步骤&…

k8s 1.23.5版本安装ingress1.6.4

1、背景 网上找了好几个ingress 文件,可能是版本没对,ingress都没有安装成功,最后查了相关资料,手动安装了。 下面是版本的匹配列表 github中ingress 地址:https://github.com/kubernetes/ingress-nginx 1.23.5版本支…

【问题解决】web页面html锚点定位后内容被遮挡问题解决【暗锚】

正常的锚点跳转 a标签的href填写目标元素的id即可 <a href"#my_target">to div1</a> <div id"my_target">div1</div> 顶栏被遮挡示例 但是当id所在元素被嵌套多层flex和relative布局之后&#xff0c;跳转后部分内容会被遮挡。 …

百度Apollo:激光雷达检测技术深度解析

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

嵌入式与单片机之间的关系是什么?

今日话题&#xff0c;嵌入式与单片机之间的关系是什么&#xff1f;可以这样理解&#xff1a;嵌入式系统是一个大的范畴&#xff0c;而单片机则是嵌入式系统中的一个重要子类。通常情况下&#xff0c;制造商出厂的通用单片机内并没有预装应用程序&#xff0c;因此无法直接运行。…

如何在Windows 10中扩展分区,这里提供步骤

一些PC制造商提供的电脑硬盘分为多个分区&#xff0c;一个用于Windows操作系统&#xff0c;另一个用于个人文件的空“数据”分区。如果你愿意&#xff0c;可以将这些分区合并为一个分区。 此技巧还可以用于删除恢复分区&#xff0c;从而释放通常用于恢复数据的空间。或者&…

灵芝,到2025年有望达到9.2亿美元

灵芝是一种传统的药食两用菌&#xff0c;其具有丰富的营养成分和医疗价值&#xff0c;因此备受关注。全球市场分析 从全球市场来看&#xff0c;近年来灵芝的市场需求持续增长。据估计&#xff0c;2019年全球灵芝市场规模为4.1亿美元&#xff0c;到2025年有望达到9.2亿美元。市场…