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

news2024/12/20 2:55:15

文章目录

  • 策略模式


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

策略模式

定义:
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开,并委派给不同的对象对这些算法进行管理。
策略算法是形同行为的不同实现。
结构:
抽象策略:这是一个抽象角色,通常由一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略:实现了抽象策略定义的接口,提供具体的算法实现或行为。
环境类(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();

	}

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字电路基础---锁存器

目录 锁存器 1、简介 2、实验任务 3、程序设计 3.1、缺少 else 分支的锁存器代码 3.2、补齐 else 分支 3.3、缺少 default 的 case 语句的锁存器代码 3.3、补齐 default 的 case 语句 4、本章总结 锁存器 锁存器(俗称 Latch)是数字电路中的一种…

别让存储成为ChatGPT大模型训练的关键瓶颈

当下科技行业be like... 据说现在的科技公司,不是在抢GPU,就是在往抢GPU的路上……此前4月,特斯拉CEO马斯克就购买了1万块GPU,他还称公司将继续大量购买英伟达的GPU。 在国内,近日也有报道称,字节跳动今年…

MySQL数据库事务和存储引擎(贼详细)

目录 一、MySQL 事物 1、事务的概念 2、 事务的ACID特点 (1)原子性 (2)一致性 (3) 隔离性 (4)事务之间的相互影响 (5) Mysql及事物隔离级别 &#…

你知道视频配音怎么配出好听的声音吗

小明:最近我在制作一个视频项目,但是我发现视频中的原声不够理想,我想给它配上好听的声音。你知道怎么配音才能让声音听起来更好吗? 小李:当然!配音是提升视频质量的重要一环。想知道视频配音怎么配出好听…

uniapp实现应用wgt资源热更新

APP更新一般有两种形式 1、整包更新,通过hbuliderx提供的在线云打包就属于整包更新,属于全量更新,缺点就是打包时间长、要重新走市场审核。费时 2、wgt资源包热更新,通过hbuliderx打wgt包 ,速度快,能在应用…

iphone测试中除了appium,还有更好用的工具吗

除了Appium,还有一些其他的工具可以用于iPhone测试,下面列举几个: 1. XCUITest XCUITest是苹果官方提供的UI自动化测试框架,可以用于iPhone和iPad应用程序的自动化测试。XCUITest可以模拟用户操作,例如点击、滑动、输…

机器学习实践(1.1)XGBoost分类任务

前言 XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参…

若依微服务 + seata1.5.2版本分布式事务(安装配置nacos+部署)

若依官方使用的1.4.0版本seata,版本较低配置相对更麻烦一些 一、seata服务端下载,下载方式介绍两种入口,如下: 1、找到对应版本,下载 binary 即可。 下载包名为:seata-server-1.5.2.zip 2. github上下载 …

WWDC2023 Metal swift 头显ARKit支持c c++ 开发

1 今年WWDC,我们看见了苹果的空间计算设备,visionOS也支持了c c API. 这有什么好处呢,不是说能够吸引更多c c开发者加入苹果开发者阵营,而是我们过去的很多软件,可以轻松对接到苹果的头显设备,让我们的软件…

2023年协议转让研究报告

第一章 概述 协议转让作为中国企业破产法中的重要程序之一,已经在实践中得到广泛应用。在协议转让过程中,债务人与债权人或其他相关方通过协商达成一致,将特定的资产或权益进行转让,以实现债务清偿或债务人的破产清算。协议转让的…

RRC重建比率高问题分析和优化方法

PART01 1、重建概述 RRC重建(RRC connection re-establishment)是UE处于RRC_CONNECTED状态,因为一些移动性管理或底层链路故障,导致连接中断,UE发起的空口资源重新建立的过程,以继续空口的RRC连接。重建是…

[CSP-S 2021] 回文

[CSP-S 2021] 回文 题目描述: 给定正整数 n 和整数序列 a1​,a2​,…,a2n​,在这 2n 个数中,1,2,…,n 分别各出现恰好 2 次。现在进行 2n 次操作,目标是创建一个长度同样为 2n 的序列 b1​,b2​,…,b2n​,初始时 b 为空序列&…

【SpringCloud入门】-- SpringCloud优质组件介绍

目录 1. SpringCloud优质项目 2. 介绍SpringCloud优质项目 SpringCloudConfig(Spring) SpringCloudBus Eureka Hystrix Zuul Archaius Consul SpringCloudForCloudFoundry SpringCloudSleuth SpringCloudDataFlow SpringCloudSecurity SpringCloudZookeeper Spr…

【Redis】孔夫子旧书网爬虫接入芝麻代理IP:代理IP利用效率最大化

背景: 之前用过芝麻IP,写过这几篇文章 《【Python】芝麻HTTP代理系列保姆级全套攻略(对接教程自动领取每日IPIP最优算法)》 《【Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品教程)》 《爬虫增加代理池:使用稳…

ICC2:自定义快捷键和菜单

把一些常用的功能放在一个菜单里是什么体验?直接放在工具栏里是不是更方便?那设置成快捷键呢? gui_create_menu 自定义菜单可以把工具常用的功能放到一个菜单里,用户也可以把“执行脚本操作”加到菜单里。 举例来说: 1)把Editor Toolbox放到Favorite菜单里,floorplan 操…

行业报告 | AIGC发展研究

原创 | 文 BFT机器人 01 技术篇 深度学习进化史:知识变轨 风起云涌 已发生的关键步骤: 人工神经网络的诞生 反向传播算法的提出 GPU的使用 大数据的出现 预训练和迁移学习 生成对抗网络 (GAN) 的发明 强化学习的成功应用 自然语言处理的突破 即将发生的关键…

MinGW-w64安装和使用_亲测有效

MinGW-w64 是什么!? MinGW-w64 是一个在 Windows 系统上运行的 GNU 编译器套件,支持 C 和 C 语言的编译。它包括了 GCC 编译器、GNU Binutils 和一些其他的工具。在 MinGW-w64 中 各个版本的参数含义如下: x86_64:表…

1.ORB-SLAM3系统概述

1.内容简介 本系列文章主要基于ORB-SLAM3代码、论文以及相关博客,对算法原理进行总结和梳理。 ORB-SLAM系列整体架构是不变的,都包含Tracking、LocalMapping和LoopClosing三个核心线程,中间伴随着优化过程。在ORB-SLAM3算法中比较突出的改进…

腾讯安全董志强:四大关键步骤促进数据安全治理闭环,提升企业免疫力

高速发展的数字时代,数据已成为推动产业发展的最重要生产要素之一,真正成为了创造经济财富的数字能源,守护数据资产的安全成为企业高质量发展不可回避的重要命题。 6月13日,腾讯安全联合IDC发布“数字安全免疫力”模型框架&#…

我被一家无货源电商培训公司骗了怎么办?

我是卢松松,点点上面的头像,欢迎关注我哦! 最近,一位被无货源电商培训骗的人找到了卢松松,她说: 老师,你好,我是被无货源电商课程骗了的受害人,走投无路了,想…