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

设计模式(十一)策略模式

请直接看原文:
设计模式(十一)策略模式_某移动支付系统在实现账户资金转入和转出时需要进行身份验证,该系统为用户提供了-CSDN博客

-------------------------------------------------------------------------------------------------------------------------------- 

前言

当我们写代码时总会遇到一种情况就是我们会有很多的选择,由此衍生出很多的if…else,或者case。如果每个条件语句中包含了一个简单的逻辑,那还比较容易处理,如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿,维护的成本也会加大,这显然违背了开放封闭原则。这一讲我们就来讲策略模式,来看看它是怎么解决如上所说的问题的。

1.策略模式简介
策略模式定义

定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。策略模式模式使得算法可独立于使用它的客户而独立变化。

策略模式UML图

这里写图片描述

  • Context:用来操作策略的上下文环境。
  • Stragety:策略的抽象。
  • ConcreteStragetyA、ConcreteStragetyB:具体的策略实现。
2.策略模式简单实现

这回我们还举武侠的例子,张无忌作为一个大侠会遇到很多的对手,如果每遇到一个对手都用自己最厉害的武功去应战这显然是不明智的,于是张无忌想出了三种应战的策略分别对付三个实力层次的对手。

定义策略接口

策略接口有一个fighting的方法用于战斗:

public interface FightingStrategy {public void fighting();
}
具体策略实现

分别定义三个策略来实现策略接口,用来对付三个实力层次的对手:

public class WeakRivalStrategy implements FightingStrategy {@Overridepublic void fighting() {System.out.println("遇到了较弱的对手,张无忌使用太极剑");}
}
public class CommonRivalStrategy implements FightingStrategy {@Overridepublic void fighting() {System.out.println("遇到了普通的对手,张无忌使用圣火令神功");}
}
public class StrongRivalStrategy implements FightingStrategy {@Overridepublic void fighting() {System.out.println("遇到了强大的对手,张无忌使用乾坤大挪移");}
}
实现环境类

环境类的构造函数包含了策略类,通过传进来不同的具体策略来调用不同策略的fighting方法:

public class Context {private FightingStrategy fightingStrategy;public Context(FightingStrategy fightingStrategy) {this.fightingStrategy = fightingStrategy;}public void fighting(){fightingStrategy.fighting();}
}
客户端调用

张无忌遇到了三个对手:宋青书、灭绝师太和成昆,他分别采用了不同的策略来应战:

public class ZhangWuJi {public static void main(String[] args) {Context context;//张无忌遇到对手宋青书,采用对弱的对手的策略context = new Context(new WeakRivalStrategy());context.fighting();//张无忌遇到对手灭绝师太,采用对普通的对手的策略context = new Context(new CommonRivalStrategy());context.fighting();//张无忌遇到对手成昆,采用对强劲的对手的策略context = new Context(new StrongRivalStrategy());context.fighting();}
}

3.策略模式优缺点和使用场景
优点
  • 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
  • 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
缺点
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
  • 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
使用场景
  • 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
  • 一个类定义了很多行为,而且这些行为在这个类里的操作以多个条件语句的形式出现。策略模式将相关的条件分支移入它们各自的 Strategy 类中以代替这些条件语句。

相关文章:

设计模式(十一)策略模式

请直接看原文:设计模式(十一)策略模式_某移动支付系统在实现账户资金转入和转出时需要进行身份验证,该系统为用户提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…...

Java 计算某年份二月的天数

一、实验任务 要求编写一个程序,从键盘输入年份,根据输入的年份计算这一年的2月有多少天。 二、实验内容 三、实验结果 四、实现逻辑和步骤 (1)使用scanner类实现程序使用键盘录入一个年份。 (2)使用if语…...

unity 数学 如何计算线和平面的交点

已知一个平面上的一点P0和法向量n,一条直线上的点L0和方向L,求该直线与该平面的交点P 如下图 首先我们要知道向量归一化点乘之后得到就是两个向量的夹角的余弦值,如果两个向量相互垂直则值是0,小于0则两个向量的夹角大于90度,大于…...

Mysql DATETIME与TIMESTAMP的区别

TIMESTAMP的取值范围小,并且TIMESTAMP类型的日期时间在存储时会将当前时区的日期时间值转换为时间标准时间值,检索时再转换回当前时区的日期时间值。 而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。 DATETI…...

hadoop基础

启动Hadoop cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop打开 ./bin/hdfs dfs ./bin/hdfs dfs -ls 针对 DataNode 没法启动的解决方法 cd /usr/local/hadoop ./sbin/stop-dfs.sh # 关闭 rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的…...

2024目前三种有效加速国内Github

大家好我是咕噜美乐蒂,很高兴又和大家见面了!截至2024年,国内访问 GitHub 的速度受到多种因素的影响,包括网络封锁、地理距离、网络带宽等。为了提高国内用户访问 GitHub 的速度,以下是目前较为有效的三种加速方式&…...

2024高频前端面试题 HTML 和 CSS 篇

JS和ES6 篇: ​​​​​​​2024高频前端面试题 JavaScript 和 ES6 篇-CSDN博客 一 . HTML 篇 1. H5有什么新特性 1) 语义化标签 用正确的标签做正确的事情。 html 语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析&…...

LeetCode 100231.超过阈值的最少操作数 I

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次操作中,你可以删除 nums 中的最小元素。 你需要使数组中的所有元素都大于或等于 k ,请你返回需要的 最少 操作次数。 示例 1: 输入:nums [2,11,10,1,3], k 10 输…...

Pygame教程01:初识pygame游戏模块

Pygame是一个用于创建基本的2D游戏和图形应用程序。它提供了一套丰富的工具,让开发者能够轻松地创建游戏和其他图形应用程序。Pygame 支持许多功能,包括图像和声音处理、事件处理、碰撞检测、字体渲染等。 Pygame 是在 SDL(Simple DirectMed…...

HTML和CSS (前端共三篇)【详解】

目录 一、前端开发介绍 二、HTML入门 三、HTML基础标签 四、CSS样式修饰 五、HTML表格标签 六、HTML表单标签 一、前端开发介绍 web应用有BS和CS架构两种,其中我们主要涉及的是BS架构。而BS架构里,B(Browser浏览器)是客户端的…...

Linux——进程控制(二)进程等待

目录 前言 一、进程等待 二、如何进行进程等待 1.wait 2.waitpid 2.1第二个参数 2.2第三个参数 3. 等待多个进程 三、为什么不用全局变量获取子进程的退出信息 前言 前面我们花了大量的时间去学习进程的退出,退出并不难,但更深入的学习能为本…...

多线程导入excel

设置线程池参数,创建线程池 corePoolSize要保留在池中的线程数,即使它们是空闲的,除非{code - allowCoreThreadTimeOut}被设置maximumPoolSize允许在池中的最大线程数keepAliveTime当线程数大于核心时,这是多余的空闲线程将在终止…...

设计模式(十五)状态模式

请直接看原文:设计模式系列 ------------------------------------------------------------------------------------------------------------------------------- 前言 建议在阅读本文前先阅读设计模式(十一)策略模式这篇文章,虽说状态…...

Java基于SpringBoot的在线文档管理系统的设计与实现论文

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景,运用软件工程原理和开发方法&am…...

突破编程_C++_STL教程( list 的高级特性)

1 std::list 的排序 1.1 基础类型以及 std::string 类型的排序 std::list的排序可以通过调用其成员函数sort()来实现。sort()函数使用默认的比较操作符&#xff08;<&#xff09;对std::list中的元素进行排序。这意味着&#xff0c;如果元素类型定义了<操作符&#xff…...

Scratch 第十六课-弹珠台游戏

第十六课-弹珠台游戏 大家好&#xff0c;今天我们一起做一款弹珠台scratch游戏&#xff0c;我们也可以叫它弹球游戏&#xff01;这款游戏在刚出来的时候非常火爆。小朋友们要认真学习下&#xff01; 这节课的学习目标 物体碰撞如何处理转向问题。复习键盘对角色的控制方式。…...

对简单工厂模式、工厂方法模式的思考

目录 1 背景1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 2 简单工厂模式3 工厂方法模式4 思考4.1 改进工厂方法模式 1 背景 题目源自&#xff1a;【设计模式专题之工厂方法模式】2.积木工厂 1.1 题目描述 小明家有两个工厂&#xff0c;一个用于生产圆形积木…...

【详识JAVA语言】面向对象程序三大特性之二:继承

继承 为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程序是就需要考虑。 比如&…...

【剑指offer--C/C++】JZ3 数组中重复的数字

一、题目 二、本人思路及代码 这道题目它要求的时间空间利用率都是n&#xff0c;那么可以考虑创建一个长度为n的数组repeat初始化为0&#xff0c;下标代码出现的数字&#xff0c;下标对应的数组内容代表该下标数字出现的次数。然后遍历提供的数组&#xff0c;每出现一个数字&a…...

基于SpringBoot的在线拍卖系统设计与实现(源码)

项目源码&#xff1a;https://gitee.com/oklongmm/biye2 引言 随着互联网技术的发展&#xff0c;电子商务得以快速发展&#xff0c;其中之一的在线拍卖系统也逐渐得到了广泛的应用。但是&#xff0c;现有的在线拍卖系统在操作复杂性、安全性和稳定性方面存在一定的问题。为了…...

为什么你的FastAPI AI接口无法流式输出?揭秘EventSource兼容性断层、中间件拦截陷阱与response_model边界漏洞

第一章&#xff1a;FastAPI 2.0 异步 AI 流式响应 配置步骤详解FastAPI 2.0 原生强化了对异步流式响应&#xff08;StreamingResponse&#xff09;的支持&#xff0c;特别适用于大语言模型&#xff08;LLM&#xff09;推理场景中逐 token 返回生成结果的需求。配置关键在于正确…...

Ruoyi框架一键改包工具:快速定制化你的项目基础配置

1. Ruoyi框架一键改包工具是什么&#xff1f; 如果你用过Ruoyi框架开发项目&#xff0c;肯定遇到过这样的烦恼&#xff1a;每次新建项目都要手动修改groupId、artifactId、包名这些基础配置&#xff0c;不仅麻烦还容易出错。我刚开始用Ruoyi时&#xff0c;光是改这些配置就要花…...

飞机遥感影像的数据集记录

飞机遥感影像的数据集记录&#xff1a; - 飞机检测数据集&#xff1a; DIOR、NWPU VHR-10、DOTA、LEVIR和RSOD等,但是上述数据集没有提供飞机目标具体型号信息,仅适用于飞机目标检测&#xff0c;不适用于飞机目标细粒度识别算法研究。 - 1. 飞机切片目标分类任务&#xff1a; M…...

从博弈论到你的模型:用‘公平分配’思想SHAP,拆解一次房贷审批预测

从博弈论到房贷审批&#xff1a;用SHAP算法拆解模型决策黑箱 想象一下&#xff0c;你作为银行风控部门的算法工程师&#xff0c;刚刚部署了一套全新的房贷审批模型。某天&#xff0c;业务主管拿着一个被模型拒绝的案例来找你&#xff1a;"这位申请人信用分680&#xff0c;…...

Mem Reduct内存管理功能完全指南:从基础设置到高级优化

Mem Reduct内存管理功能完全指南&#xff1a;从基础设置到高级优化 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct M…...

# 拍摄剪辑文案公司哪个技术强?专业视角解析行业标杆在数

拍摄剪辑文案公司哪个技术强&#xff1f;专业视角解析行业标杆在当今数字内容爆炸式增长的时代&#xff0c;优质视频内容已成为品牌营销的核心竞争力。"拍摄剪辑文案策划"的一站式服务模式&#xff0c;正在取代传统的分散作业方式&#xff0c;为各类企业提供更高效的…...

为什么83%的医疗PHP系统脱敏失效?——基于127家三甲医院审计报告的脱敏逻辑漏洞图谱分析

第一章&#xff1a;医疗PHP系统数据脱敏失效的审计全景图在医疗信息化系统中&#xff0c;PHP仍广泛用于HIS、LIS及预约平台等后端服务。然而&#xff0c;大量遗留系统在数据脱敏环节存在设计缺陷或配置疏漏&#xff0c;导致患者姓名、身份证号、病历号、手机号等敏感字段在日志…...

Blocks UI组件开发终极指南:7步创建自定义组件

Blocks UI组件开发终极指南&#xff1a;7步创建自定义组件 【免费下载链接】blocks A JSX-based page builder for creating beautiful websites without writing code 项目地址: https://gitcode.com/gh_mirrors/bl/blocks Blocks是一个基于JSX的页面构建工具&#xff…...

Docker 从入门到实践:容器化你的应用

Docker 从入门到实践&#xff1a;容器化你的应用 在当今快速发展的软件开发领域&#xff0c;Docker 已成为一项革命性的技术&#xff0c;它通过容器化技术彻底改变了应用的开发、部署和运行方式。无论是开发者、运维工程师还是技术爱好者&#xff0c;掌握 Docker 都能显著提升…...

Pixel Dream Workshop效果展示:像素角色动作帧序列生成演示

Pixel Dream Workshop效果展示&#xff1a;像素角色动作帧序列生成演示 1. 像素艺术的新纪元 在数字艺术创作领域&#xff0c;像素艺术正经历着前所未有的复兴。Pixel Dream Workshop作为新一代像素艺术生成工具&#xff0c;将传统像素美学与现代AI技术完美融合&#xff0c;为…...