设计模式详解(十四)——策略模式

策略模式简介

策略模式定义
策略模式(Strategy Pattern)是一种行为型设计模式,它使能在运行时改变对象的行为。策略模式属于对象行为模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户。策略模式使得算法可以独立于使用它的客户端变化。

策略模式包含以下角色:

  1. 策略接口(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。它定义了可供客户端使用的各种策略的方法。
  2. 具体策略(ConcreteStrategy):实现了策略接口的具体策略类,封装了具体的算法或行为。
  3. 上下文(Context):它是客户端和策略之间的桥梁,主要用于给客户端调用。使用一个策略接口的引用,其过程可以针对抽象策略接口编程。Context 将客户端的请求委托给策略对象来执行。

策略模式优缺点:
优点:

  1. 策略类之间自由切换:由于策略类实现的是同一个抽象,策略模式提供了对算法的自由切换,将算法的使用与算法的实现分离开来,使得算法独立于使用它的客户端变化。
  2. 扩展性:策略模式使得在运行时可以动态地改变对象的行为。可以不改动原有代码,增加一个新的策略对策略模式来说比较容易。降低了算法实现类与客户端的耦合度,提高了代码的可维护性和可扩展性。
  3. 简化单元测试:策略模式使得每一个算法都有自己的类,这样单元测试的时候,针对某一个具体算法测试的时候更加简单和方便。
  4. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句

缺点:
1.客户端必须知道不同策略的存在:客户端必须了解不同策略,以便根据需求选择合适的策略对象,从而具有一定的复杂度。
2.增加了对象的数目:由于策略模式将算法单独提取出来封装成策略类,因此会增加系统中类的个数,,从而也具有一定的复杂度。
3.当策列类太多的话,维护策略类会有额外开销,因此策略类数量多了的话会比较麻烦。

使用场景

  1. 当一个系统有许多许多行为,或者一个系统需要根据运行时的情形使用不同的行为时。
  2. 当需要在不同时间应用不同的行为时,可以考虑使用策略模式。
  3. 当一个对象有很多的行为,并且这些行为在将来的版本中可能会发生变化时。

以下举一个策略模式的例子:
下面通过一个简单的例子来演示。比如我们出去玩时可以选择的出行策略有很多种:汽车、火车、飞机,,高铁等每种出行策略都有各自的使用方法,只要能到目的地,我们可以随意更换各种策略。

创建抽象策略角色(Strategy)

/*** 抽象策略角色*/
public interface ChooseMode {void getChoose();
}

创建具体策略角色:(ConcreteStrategy)

/*** 具体策略角色:汽车*/
public class Car implements ChooseMode {@Overridepublic void getChoose() {System.out.println("已选择交通方式,坐汽车。");}
}
/*** 具体策略角色:飞机*/
public class Plane implements ChooseMode {@Overridepublic void getChoose() {System.out.println("已选择交通方式,坐飞机");}
}
/*** 具体策略角色:火车*/
public class Trian implements ChooseMode {@Overridepublic void getChoose() {System.out.println("已选择交通方式,坐火车。");}
}

创建环境类(Context)

/*** 环境类*/
public class Choose {private ChooseMode chooseMode;public void setChooseMode(ChooseMode chooseMode) {this.chooseMode = chooseMode;}public void getChoose() {chooseMode.getChoose();}
}

创建客户端(Client)

public class Client {public static void main(String[] args) {Choose choose = new Choose();System.out.println("选择方案一出行:");choose.setChooseMode(new Car());choose.getChoose();System.out.println("选择方案二出行:");choose.setChooseMode(new Trian());choose.getChoose();System.out.println("选择方案三出行:");choose.setChooseMode(new Plane());choose.getChoose();}
}

输出结果如下所示:

选择方案一出行:
已选择交通方式,坐汽车。
选择方案二出行:
已选择交通方式,坐火车。
选择方案三出行:
已选择交通方式,坐飞机

在上述例子中,我们定义了三个具体的交通工具类(具体策略类),实现了抽象策略接口的getChoose方法。三种交通工具提供了三种不同的getChoose方法的实现,这三种不同的getChoose方法的就是一系列算法。 在环境类中,我们定义了抽象工具类的接口。最终再客户端选择需要的交通方式出行就能得到想要的策略方法。客户端只需要知道使用哪一个算法。使用策略模式,就可以切换算法和增加新的交通方式。

总而言之:
策略模式是一种行为型设计模式,它允许在运行时动态改变对象的行为。通过定义一系列可互换的算法,策略模式将算法与使用算法的客户端分离,从而提高代码的灵活性和可维护性。策略模式的核心在于将算法封装成独立的策略类,客户端则通过上下文类来调用这些策略。这种模式适用于多种算法或行为需要自由切换的场景,能有效减少条件语句的使用,简化单元测试。然而,它也可能增加对象的数量,且客户端需要了解不同策略的存在。总的来说,策略模式是一种强大且灵活的设计工具,有助于构建可扩展和可维护的软件系统。


以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git

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

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

相关文章

【央国企专场】——国家电网

国家电网目录 一、电网介绍1、核心业务2、电网组成 二、公司待遇三、公司招聘1、招聘平台2、考试安排2.3 考试内容 一、电网介绍 1、核心业务 国家电网公司(State Grid Corporation of China,简称SGCC)是中国最大的国有企业之一&#xff0c…

第三周周一技术课讲义

第三周周一技术课讲义 条件控制语句 break 不能单独存在的。可以用在switch和循环中&#xff0c;表示结束&#xff0c;跳出的意思。 代码示例&#xff1a; //1.找出100-1000中前5个79的倍数 ​ int j 0; //用来计数 for (int i 100; i < 1000; i) {if(i % 79 0){j; …

LeetCode 热题 100 题解(二):双指针部分(2)| 滑动窗口部分(1)

题目四&#xff1a;接雨水&#xff08;No. 43&#xff09; 题目链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water/description/?envTypestudy-plan-v2&envIdtop-100-liked 难度&#xff1a;困难 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&am…

树的总结学习

一、树的遍历 其实深度优先遍历&#xff1a;是指先序、中序和后序&#xff0c;广度优先就是层序遍历。 ①、先序遍历 void PreOrder(BTNode *b) {if(b ! NULL){std::cout << b->data << std::endl;PreOrder(b->left);PreOrder(b->right);} } ②、中序…

如何将三方库集成到hap包中——通过IDE集成非cmake方式构建的C/C++三方库

简介 DevEco Studio(简称IDE)目前只支持cmake构建方式&#xff0c;对于非cmake构建方式的三方库需要通过IDE工具集成的话&#xff0c;我们需要对原生库编写一个cmake的构建脚本。本文通过tinyxpath三方库为例介绍如何在IDE上移植一个非cmake构建方式的三方库。 cmake构建脚本…

中拔出溜的公司如何实施DEVOPS

虽然推进起来很艰难&#xff0c;但在这类公司也并非一无是处&#xff1a;只要让各方尤其是领导曾看到了成效&#xff0c;大范围铺开很容易&#xff0c;你也非常容易因此变得出众。 0. 标题 1. 中拔出溜公司的特点2. 循序渐进2.1 从研发团队开始2.2 先CI&#xff08;持续集成&am…

2024年第十七届“认证杯”数学中国数学建模网络挑战赛D题思路

D题 AI绘画带来的挑战(本题仅限专科组和爱好者组选用) 2023 年开年, ChatGPT作为一款聊天型AI工具,成为了超越疫情的热门词条;而在 AI 的另一个分支——绘图领域,一款名为 Midjourney(MJ)的软件,热度完全不亚于ChatGPT。AI绘画技术可以模仿设计师的风格和技巧,自动生…

中介者模式:简化对象间通信的协调者

在面向对象的软件开发中&#xff0c;中介者模式是一种重要的行为型设计模式&#xff0c;用于降低多个对象间通信的复杂性。通过提供一个中心化的对象来处理不同组件之间的交互&#xff0c;中介者模式使得组件间不必显式引用彼此&#xff0c;从而使其松散耦合、更易于维护。本文…

【日常记录】【CSS】生成动态气泡小球

文章目录 1、分析2、实现 1、分析 核心有两点&#xff0c;通过这两个不一样就可以实现每个小球的颜色、动画时间不一致 给每个元素都设置一个css 变量 bgc 用于控制每一个小球的颜色给每个元素都设置一个css 变量 duration 用于控制每一个小球的时间 2、实现 <!DOCTYPE ht…

Python连接星环数仓取数

有公众号群的小伙伴问我,有没有实现python连接星环数仓取数的代码,刚好有用,就做了一下分享。可能别的小伙伴也有需求,故分享到公众号中,感兴趣的小伙伴可以跟着实现一下。之前的文章分享了python连接sql取数和实现自动化发邮件代码,感兴趣的朋友可以到阿黎逸阳的代码公众…

STM32H7的Cache学习和应用

STM32H7的Cache学习和应用 啥是Cache&#xff1f;Cache的配置配置 Non-cacheable配置 Write through&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate…

在IntelliJIDEA中如何将依赖包打入项目中?

在IntelliJIDEA中将依赖包打入项目主要有以下几种场景和步骤&#xff1a; 一. 对于 Maven 项目&#xff1a; 在 pom.xml 文件中正确声明所需的依赖。IDEA 会自动从 Maven 仓库下载这些依赖。 构建项目时&#xff0c;默认情况下 Maven 不会将依赖包直接打进 JAR/WAR 文件中&am…

科软24炸穿了,25还能冲吗?

25考研&#xff0c;科软必然保持大热 不是吧兄弟&#xff0c;明眼人都能看出来&#xff0c;科软以后不会出现大冷的局面了&#xff0c;除非考计算机的人减少&#xff0c;因为科软简直是叠满了buff&#xff0c;首先科软的专业课是22408&#xff0c;考的是数学二&#xff0c;这就…

北斗导航 | 北斗三号区域短报文服务解析

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 北斗三号区域短报文服务解析 1、引言2、北斗三号区域短报文服务原理与改…

腾讯云人脸服务开通详解:快速部署,畅享智能体验

请注意&#xff0c;在使用人脸识别服务时&#xff0c;需要确保遵守相关的法律法规和政策规定&#xff0c;保护用户的合法权益&#xff0c;并依法收集、使用、存储用户信息。此外&#xff0c;腾讯云每个月会提供一定次数的人脸识别调用机会&#xff0c;对于一般的小系统登录来说…

C++类和对象(四)——类的实现、const、explicit、static

1. 日期类的实现&#xff08;包括前置和后置&#xff09; Date.h #pragma once #include<iostream> #include<assert.h> using namespace std;class Date { public:bool CheckInvalid() const;Date(int year 1, int month 1, int day 1);bool operator<(co…

7. Spring Boot 创建与使用

经过前面的六篇文章&#xff0c;Spring Framework的知识终于大致讲完了&#xff0c;但是Spring AOP还没提到&#xff0c;个人认为Spring AOP更适合放在Spring MVC之后再讲解&#xff0c;而讲解Spring MVC前先学习Spring Boot的目的也是为了在学习Spring MVC的时候直接使用Sprin…

【云原生篇】K8S部署全面指南

部署Kubernetes&#xff08;K8s&#xff09;有多种方式&#xff0c;可以根据组织的需求、基础设施和资源来选择最合适的部署方法。以下是一些主流的Kubernetes部署方式&#xff1a; 1. 手动部署 kubeadm&#xff1a;Kubernetes官方提供的工具&#xff0c;可以帮助你快速部署和…

C#中计算矩阵的逆可以使用数学库

在C#中计算矩阵的逆可以使用数学库&#xff0c;比如MathNet.Numerics。这个库提供了丰富的数学函数&#xff0c;包括线性代数运算。以下是一个使用MathNet.Numerics计算矩阵逆的简单示例&#xff1a; 首先&#xff0c;你需要安装MathNet.Numerics库。你可以通过NuGet包管理器来…

项目管理软件评测:选择合适软件是关键

在过去&#xff0c;中小企业项目管理沿用的是office全家桶&#xff0c;用到后面项目由简单变复杂&#xff0c;项目资源越来越庞大&#xff0c;项目成员越来越多&#xff0c;项目管理问题日益凸显。好用的项目管理软件是化解问题的好方法&#xff0c;好用的项目管理软件是什么样…