Java设计模式-9 、策略模式

策略模式

策略模式( Strategy Pattern )属于对象的⾏为模式。其⽤意是针对⼀组算 法,将每⼀个算法封装到具有共同接⼝的独⽴的类中,从⽽使得它们可以 相互替换。策略模式使得算法可以在不影响到客户端的情况下发⽣变化。 其主要⽬的是通过定义相似的算法,替换 if else 语句写法,并且可以随时 相互替换。

策略模式有什么好处?

定义了⼀系列封装了算法、⾏为的对象,他们可以相互替换。
举例: Java.util.List 就是定义了⼀个增( add )、删( remove )、改 ( set )、查( indexOf )策略,⾄于实现这个策略的 ArrayList 、 LinkedList 等类,只是在具体实现时采⽤了不同的算法。但因 为它们策略⼀样,不考虑速度的情况下,使⽤时完全可以互相替换使⽤。

代码:

1, 策略接口

public interface Strategy {
	PayInfo payForSometh();
}

 2 支付类的实体类

public class PayInfo {
	String payType;
	String payCode;
	String payDesc;
	
	public PayInfo(String payType, String payCode, String payDesc) {
		super();
		this.payType = payType;
		this.payCode = payCode;
		this.payDesc = payDesc;
	}

	public String getPayType() {
		return payType;
	}
	public void setPayType(String payType) {
		this.payType = payType;
	}
	public String getPayCode() {
		return payCode;
	}
	public void setPayCode(String payCode) {
		this.payCode = payCode;
	}
	public String getPayDesc() {
		return payDesc;
	}
	public void setPayDesc(String payDesc) {
		this.payDesc = payDesc;
	}
}

 3 微信支付策略

public class WxPay implements Strategy {

	@Override
	public PayInfo payForSometh() {
		System.out.println("通过微信支付");
		PayInfo pin = new PayInfo("微信", "1", "支付成功");
		return pin;
	}

}

4  支付宝策略

public class ZfbPay implements Strategy {

	public PayInfo payForSometh() {
		System.out.println("调用支付宝支付功能,根据返回值进行PayInfo类信息的设置");
        PayInfo zhifubaoPayInfo= new PayInfo("支付宝", "0", "支付成功");
        return zhifubaoPayInfo;
	}

}

 5.  测试类

public class TMain {

	public static void main(String[] args) {
		Strategy strategy = new WxPay();
		Strategy strategy2 = new ZfbPay();
		PayInfo payinfo = strategy2.payForSometh();
		PayInfo payInfo = strategy.payForSometh();


		System.out.println(payinfo.getPayType() + "," + payinfo.getPayCode() + "," + payinfo.getPayDesc());
		System.out.println(payInfo.getPayType() + "," + payInfo.getPayCode() + "," + payInfo.getPayDesc());
	}
}

6 结果

 注意: 如果实际spring中应用策略,是要用bean的引入的。

这篇优化文章中有例子代码:

一次代码优化经验的分享_6个日的梦想的博客-CSDN博客

总结

  1. 在我的理解中策略模式的核心就是面向接口编程。把每个具体的算法封装成一个类,使用继承方便封装公共需求,减少了算法间的耦合。
  2. 使用context上下文对象,减轻了客户端的职责。由context来去判断使用哪种算法。当然这一部分你可以使用反射,使用了反射的话那么switch语句都省了。
优点
1.解耦,避免使用多重条件判断。
2.可扩展新好

缺点
1.类会增多
2.所有策略类都需要对外暴露

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

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

相关文章

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…

手敲Mybatis(八)-参数处理器

前言在之前的章节里边,类PreparedStatementHandler我们还没有处理在执行Sql时的参数,目前是硬编码写死存储的,如:ps.setLong(),这里就只能处理long类型的数据因为写死了,我们需要处理下让它支持设置不同的数…

【Linux 网络编程4】网络层--UDP/TCP协议,3次握手4次挥手、粘包问题等

netstat命令-n.拒绝显示别名,能显示数字的全部转化成数字(IPPORT)-l 仅列出有在 Listen (监听) 的服务的状态-p 显示建立相关链接的程序名(pid)-t 仅显示tcp相关选项-u 仅显示udp相关选项 2.UDP协议2.1.全双工和半双工的区别全双工&#xff1…

了解Session、LocatStorage、Cache-Control、ETag区别

一、cookie与session有什么区别? 1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HT…

SpringBoot学习笔记(4)-分析 SpringBoot 底层机制

文章目录4. 分析 SpringBoot 底层机制4.1 Tomcat启动分析4.2 创建Spring 容器4.3 将Tomcat 和 Spring 容器关联,并启动 Spring 容器4.4 扩展-debug查看 ac.refresh()4. 分析 SpringBoot 底层机制 【Tomcat 启动分析 Spring 容器初始化Tomcat 如何关联 Spring 容器…

微软分享修复WinRE BitLocker绕过漏洞的脚本

微软发布了一个脚本,可以更轻松地修补 Windows 恢复环境 (WinRE) 中的 BitLocker 绕过安全漏洞。 此 PowerShell 脚本 (KB5025175) 简化了保护 WinRE 映像以防止试图利用CVE-2022-41099漏洞的过程,该漏洞使攻击者能够绕过 BitLocker 设备加密功能系统存…

jvm03垃圾回收篇

p134 垃圾回收相关章节的说明 p135 什么是GC 为什么需要GC P136 了解早起垃圾回收行为 p137 java自动内存管理介绍 p138垃圾回收相关算法概述 p139引用计数算法的原理及优缺点 p140 python引用计数实施方案 p141 可达性分析算法与GC ROOTS p142 对象的finalization机制 p143 代…

【MyBatis】字段名和属性名不同时,如何处理

目录 前言 1、返回类型:resultType 2、返回字典映射:resultMap 2.1、字段名和属性名不同怎么处理 解决方案一:使用resultMap 解决方案二:使用as起别名 3、多表查询 总结: 前言 在之前的文章中,我们可…

TXT 和 SEV技术小知识

1.Intel TXT 可信执行技术(Trusted Execute Technology,TXT)是Intel公司的可信计算技术,主要通过改造芯片组和CPU,增加安全特性,通过结合一个基于硬件的安全设备—可信平台模块(Trusted Platform Module,TPM)&#xf…

蓝桥杯C/C++VIP试题每日一练之Sine之舞

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

Python 之列表推导式

文章目录参考描述列表推导式举个栗子基本形式一般式基本形式(高阶)判断使用逻辑运算符笛卡尔积拆解变量污染列表推导式参考 项目描述流畅的 PythonLuciano Ramalho 著 / 安道 吴珂 译搜索引擎Bing 描述 项目描述Python3.10.6 列表推导式 列表推导式是…

python---函数的进阶

函数的进阶 1.8函数的进阶 1.8.1函数作为参数进行传入 1.简介:函数作为范围进行传递到函数中进行操作 2.函数作为参数传入到函数中 3.函数调用和逻辑传入之间的区别 一个是作为数据进行传入,但是调用的函数时一定的一个作为逻辑进行调用,但是…

PTA——1036 跟奥巴马一起编程、1037 在霍格沃茨找零钱、1038 统计同成绩学生、1039 到底买不买、1040 有几个PAT

1036 跟奥巴马一起编程 解决代码 模拟题目即可。 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){int n;char c;cin>>n>>c;double col(double)n/2;int n0n/2;if(col>n00.4) n01; for(int i0;i&…

华为路由器 基本ACL配置

1、什么是ACL&#xff1f; 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#xff0c;这些条件可以是报文的源地址、目的地址、端口号等。 ACL本质上是一种报文过滤器&…

Android 高通Camera2 Camera Device Close

1、很多人看到这个日志第一感觉可能觉得哪里没有合理释放&#xff0c;于是带着这个思路去进行百度探索 2、一开始我去寻找 ImageReader.OnImageAvailableListener 这个问题 var afterBitmap: Bitmap? null/**监听拍照的图片 */private val imageAvailableListener ImageRead…

GPT免费网站分享(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

从二叉查找树到B*树,一文搞懂搜索树的演进!|金三银四系列

对于准备面试这篇再适合不过了&#xff01;详细讲解了从BST、AVL、红黑树、B树、B树最后到B*树的演进过程&#xff0c;以及各种结构的优劣。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达在面试中&#xff0c;面试官很容易抛出这样的问题…

Java设计模式-2、⼯⼚模式

⼯⼚模式 工厂模式是对简单工厂的一个衍生&#xff0c;解决了许多简单工厂模式的问题。 一、说⼀说简单⼯⼚模式 简单⼯⼚模式指由⼀个⼯⼚对象来创建实例&#xff0c;客户端不需要关注创建逻 辑&#xff0c;只需提供传⼊⼯⼚的参数。 适⽤于⼯⼚类负责创建对象较少的情况&a…

wait讲解

hello啊,今天为大家带来wait的相关介绍 开始正题之前,我们要先进行一点知识点的补充 上一期我们更新了一期关于线程安全的知识,对于volatile在这里在做出一些补充 有些文章上说线程修改一个变量的时候,从主内存读取到工作内存上,在工作内存上修改完以后再返回主内存 由于t1线程…

[数据库原理与应用]educoder-MySQL 单表查询(一)

目录 第1关&#xff1a;用like匹配字符串 第2关&#xff1a;用BETWEEN AND表达查询范围 第3关&#xff1a;空值的判断 第4关&#xff1a;集合运算符IN的应用 第5关&#xff1a;消除重复结果 第6关&#xff1a;聚合函数应用 第7关&#xff1a;分组查询 第8关&#xf…