经典的设计模式21——策略模式

文章目录

  • 策略模式


猛的发现策略模式和状态模式的结构图长得到好像,可得好好区分区分。
不过真的好像,就是方法那里传递的参数不一样。
百度来一波。
在这里插入图片描述

策略模式

定义:
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开,并委派给不同的对象对这些算法进行管理。
策略算法是形同行为的不同实现。
结构:
抽象策略:这是一个抽象角色,通常由一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略:实现了抽象策略定义的接口,提供具体的算法实现或行为。
环境类(context):持有一个策略类的引用,最终给客户端调用。
本质:分离算法,选择实现。
理解:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或者行为。继承有助于析取出这些算法中的公共功能。策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 当不同的行为堆砌在一个类中,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。策略模式是用来封装算法的,但在实践中,可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。在基本的策略模式中选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。
优点:
1、策略类之间可以自由切换。‘
由于策略类都实现同一个接口,所以他们之间可以自由切换。
2、易于切换
增加一个新的策略只需添加一个具体的策略类即可,基本不需要改变原有的代码,符合开闭原则。
3、避免使用多重条件语句(if、else),充分体现面向对象的设计思想。
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多的策略类,可以通过使用享元模式在一定程度上减少对象的数量。
使用场景:
一个系统需要动态的在几种算法中选择一个时,可将每个算法封装到策略类中。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入他们各自的策略类中以代替这些条件语句。
系统中各算法彼此相互独立,且要求对客户隐藏具体算法的实现细节时。
系统要求使用算法的客户不应该知道其具体的操作的数据时,可以使用策略模式来隐藏与算法相关的数据结构。
多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。

package 策略模式;

public abstract class Strategy {
	public abstract void suanfa();

}

package 策略模式;

public class concretestrategyA extends Strategy {

	@Override
	public void suanfa() {
		System.out.println("算法A实现");

	}

}

package 策略模式;

public class concretestrategyB extends Strategy {

	@Override
	public void suanfa() {
		System.out.println("算法B实现");

	}

}

package 策略模式;

public class concretestrategyC extends Strategy {

	@Override
	public void suanfa() {
		System.out.println("算法C实现");

	}

}

package 策略模式;

public class Context {
	private Strategy strategy;

	public Context(Strategy strategy) {
		this.strategy = strategy;
	}

	public void contextInterface() {
		strategy.suanfa();
	}

}

package 策略模式;

public class Client {

	public static void main(String[] args) {
		Context context = new Context(new concretestrategyA());
		context.contextInterface();

		context = new Context(new concretestrategyB());
		context.contextInterface();

		context = new Context(new concretestrategyC());
		context.contextInterface();

	}

}

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

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

相关文章

智能无线监测器的工作原理及应用优势

在现代工业生产中,设备状态监测对于确保生产的安全性、效率和可靠性至关重要。随着科技的不断发展,智能无线监测器成为工业设备状态监测的利器。本文将介绍智能无线监测器在工业领域中的应用,以及其带来的优势和价值。 图.设备状态监测&#…

TypeScript ~ 掌握基本类型 ②

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…

SKD240

SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术(内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据),测量…

南卡OE骨传导开放式蓝牙耳机评测!舒适与音质并存!

平时买耳机的时候,你最先会关注什么方向呢?是舒适、美观,还是音质、防水? 对于我来说,首先是功能。作为一个经常健身、跑步的人,最讨厌的就是平时运动流汗进入耳朵之后那种粘腻感觉。时间长了还容易让耳道…

Windows安装postgresql数据库图文教程

数据库使用排行榜:https://db-engines.com/en/ranking 目录 一、软件简介 二、软件下载 三、安装教程 四、启动教程 一、软件简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计…

Postman快速入门(一)

一、基本介绍 postman是一款流程的接口调试工具,其特点就是使用简单,功能强大。使用角色也非常广泛,后端开发,前端人员,测试人员都可以使用它进行接口调试或测试。 下图是基本功能介绍 发送第一个请求 如果你是第一次…

免费在线压缩图片的网站

1. TinyPNG - 这是一个非常受欢迎的在线图片压缩网站,可以压缩 PNG 和 JPG 图片,保证无损压缩。 网址:TinyPNG – Compress WebP, PNG and JPEG images intelligently 2. Compressor.io - 这也是一个很好的在线图片压缩工具,可以批量上传和压缩图片,支持 PNG, JPG 和…

安卓进阶(一)App性能优化

文章目录 性能优化的目的及方向流畅性启动速度页面显示速度响应速度 稳定性ANRCrash 资源节省性 布局优化选择耗费性能较少的布局减少布局的层级(嵌套)使用布局标签尽量少用布局属性wrap_contentincludemergeinclude与merge的区别ViewStub 内存泄露常见内…

前沿技术|人工智能的崛起和发展历程

前言: 人工智能的作用是使计算机能够模仿人类智能和学习能力,从而实现自动化、智能化和优化决策的目标。 文章目录 人工智能背景介绍发展状态未来展望 总结 人工智能 背景 人工智能(Artificial Intelligence,AI)的产生…

多模态大模型综述: LLaVA, MiniGPT4

文章目录 LLaVA一. 简介1.1. 摘要1.2. 引言 二. 相关工作三. 基于GPT辅助的视觉指令数据生成四. Visual Instruction Tuning4.1 网络结构4.2 训练 LLaVA 一. 简介 题目: Visual Instruction Tuning 机构:微软 论文: https://arxiv.org/pdf/2304.08485.pdf 代码&am…

大数据大作业(课程设计)

题目:信息爬取字数统计及可视化 内容及要求: 配置Hadoop平台;利用爬虫技术爬取任一门户网站新闻栏目一定时间段内的新闻信息,保存为一个或多个文件并上传到Hadoop平台以本人学号命名的文件夹下;利用MapReduce框架编程完…

【java】JDK21 要来了

文章目录 前言更丝滑的并发编程模式虚拟线程(Virtual Threads)结构化并发(Structured Concurrency)作用域值(Scoped Values) 试验一下虚拟线程的例子结构化编程的例子Scoped Values 的例子 前言 不过多久&…

大数据分析案例-基于LightGBM算法构建航空公司满意度预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Nexus搭建Maven私有库介绍

为什么需要Maven私有库? 使用Maven获取Java依赖包的时候, 默认是从Maven的中央库下载 jar文件, 中央库的地址是: https://repo.maven.apache.org/maven2 。 如果下载速度慢, 可以使用阿里的镜像, 地址如下…

【服务器数据恢复】HP LeftHand存储raid5不可用的数据恢复案例

HP LeftHand存储简介: HP LeftHand存储支持搭建RAID5、RAID6、RAID10磁盘阵列,支持卷快照,卷动态扩容等。服务端和客户端分别如下: LeftHand存储共有三个级别:物理磁盘、基于多个物理磁盘组成的逻辑磁盘(ra…

浏览器渲染流程

解析HTML,生成DOM树,解析CSS,生成CSSOM树 将DOM树和CSSOM树结合,生成渲染树(Render Tree) Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小&#x…

Selenium+Pytest自动化测试框架实战

前言 Selenium和Pytest是非常流行的自动化测试框架,二者的配合可以有效地进行Web应用程序的测试。在使用Selenium和Pytest进行自动化测试时,可以实现自动化测试的模块化、重复使用,并且可以在现有的测试项目中方便地集成和调用。 测试框架简…

B树和B+树索引

B树索引 磁盘IO读数据到内存 malloc/new 向 kernel申请4B空间,实际系统可能给2个页面空间即8KB,剩下8KB-4B空间由 lib.so 或libc.so 的 ptmalloc 或tcmalloc管理 。这样就不需要每次去kernel申请内存 磁盘IO同理,我们读一部分数据会把一整…

学了Python后还用学R语言吗?

学习R语言是否有必要取决于你的具体需求和背景。虽然R语言和Python都是数据科学领域广泛使用的编程语言,但它们之间还是存在一些差异。 如果你主要从事数据分析、统计建模或者数据可视化等工作,那么学习R语言可能更为适合。R语言在数据处理和统计分析方…

02_类加载子系统

02_类加载子系统 一、内存结构概述二、类加载器与类的加载过程1、类加载器子系统的作用2、类加载器ClassLoader的作用3、类的加载过程 三、类加载器的分类1、启动类加载器2、扩展类加载器3、应用程序类加载器4、自定义类加载器5、获取ClassLoader的几种方式 五、双亲委派机制1、…