行为设计模式 -策略设计模式- JAVA

news2024/9/30 8:52:42

策略设计模式

    • 一 .简介
    • 二. 案例
      • 2.1 抽象策略(Strategy)类
      • 2.2 具体策略(Concrete Strategy)类
      • 2.3 环境(Context)类
      • 2.4 测试
    • 三. 结论
      • 3.1 优缺点
      • 3.2 使用场景

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一 .简介

**百度百科:**策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

个人理解: 要完成一件事情,你可以选择多种方式的时候。

定义策略设计模式是行为设计模式的一种。当我们对特定任务有多种算法并且客户端决定在运行时使用的实际实现时,使用策略模式。

策略模式的主要角色如下:

  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

二. 案例

假设我们要去旅行(travel mode),出行的方式有很多种,可以坐高铁(railway),可以坐飞机(plane),那么我们就可以通过策略模式去实现出行的方式,让客户端去选择

image-20240605135228083

2.1 抽象策略(Strategy)类

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:26
 * @Description 出行方式
 */
public interface Strategy {
    /**
     * 出行的方式
     */
    void way();
}

2.2 具体策略(Concrete Strategy)类

飞机

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:28
 * @Description 飞机
 */
public class Plane implements Strategy {
    @Override
    public void way() {
        System.out.println("飞机出行");
    }
}

铁路

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:27
 * @Description 铁路
 */
public class RailWay implements Strategy {

    @Override
    public void way() {
        System.out.println("高铁出行");
    }
}

2.3 环境(Context)类

用户连接上下文,给客户端调用的类

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:30
 * @Description 出行方式
 */
public class TravelMode {

    // 抽象策略角色的引用
    private final Strategy strategy;

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

    // 客户使用的出行方式
    public void way() {
        strategy.way();
    }
}

2.4 测试

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:29
 * @Description
 */
public class StrategyPatternTest {
    public static void main(String[] args) {
        // 飞机出行
        TravelMode travelMode = new TravelMode(new Plane());
        travelMode.way();
        // 高铁出行
        TravelMode travelMode1 = new TravelMode(new RailWay());
        travelMode1.way();
    }
}

image-20240605134710520

三. 结论

3.1 优缺点

1. 优点:

  • 策略类之间可以自由切换

    由于策略类都实现同一个接口,所以使它们之间可以自由切换。

  • 易于扩展

    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“

  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

2.缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

3.2 使用场景

  • 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
  • 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
  • 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
  • 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
  • 我们可以使用组合来为策略创建实例变量,但我们应该避免这种情况,因为我们希望将特定策略应用于特定任务。以比较器作为参数的 Collections.sort() 和 Arrays.sort() 方法也遵循相同的方法。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

Git大框架总结

下面首先是我对于git的一个小总结,主要是大框架 首先是四区,因为大部分你所有的工作都是在这四个区里的实现的,包括要提交一个东西,是先是在工作区修改,后用add添加到暂存区,后提交到本地仓库,当…

文献阅读——电力系统安全域边界通用搜索模型与近似方法

文章标题 DOI:10.13334/j.0258-8013.pcsee.190884 ©2020 Chin.Soc.for Elec.Eng. 4411 文章编号:0258-8013 (2020) 14-4411-19 中图分类号:TM 74 电力系统安全域边界通用搜索模型与近似方法 姜涛,李晓辉,李雪*&a…

十五、存储过程与函数

文章目录 0. 引用1. 存储过程概述1.1 理解1.2 分类 2. 创建存储过程2.1 语法分析 3. 调用存储过程3.1 调用格式3.2 代码举例3.3 如何调试 4. 存储函数的使用4.1 语法分析4.2 调用存储函数4.3 代码举例4.4 对比存储函数和存储过程 5. 存储过程和函数的查看、修改、删除5.1 查看5…

建筑物变化检测算法baseline工程,开箱即用,23年5月测试准确度超越阿里云aiearth

建筑物变化检测算法baseline工程,开箱即用,23年5月测试准确度超越阿里云aiearth 建筑物变化检测算法Baseline工程 项目背景 随着城市化进程的加快,对建筑物的变化进行监测变得尤为重要。这不仅有助于城市管理与规划,还能够为灾害…

LeetCode 热题 100 回顾6

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

Kubernetes高级功能

资源配额 什么是资源配额 资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。 资源配额应用 创建的…

C语言中的日志机制:打造全面强大的日志系统

前言 在软件开发中,良好的日志记录机制对于调试、监控程序状态和维护系统的稳定性至关重要。本文将介绍如何在C语言中构建一个全面强大的日志系统,并提供一些示例代码。 1. 日志的基本概念 日志级别:用于分类日志信息的重要性,…

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域,Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸,为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程,让开发者能够专注于业务逻辑的实现。无论是构建小型的…

齐次坐标的理解

齐次坐标是一种在计算机图形学、计算几何和机器人学中广泛使用的坐标表示方法。它通过引入额外的维度,将传统的欧几里得坐标转换为齐次坐标,从而简化一些数学运算,尤其是在变换(如平移、旋转和缩放)时。 齐次坐标的定…

基于SpringBoot实现QQ邮箱发送短信功能 | 免费短信服务

开发学习过程中有个短信发送功能,阿里云腾讯云等等都要money,听说qq邮箱可以实现免费发送邮箱的功能(短信发送的平替),就用这个来实现!!!【找了好多好多方法才成功的啊啊啊啊&#x…

【MySQL】查询原理 —— B+树查询数据全过程

使用B树作为索引结构的原因: 一种自平衡树: B树在插入和删除的时候节点会进行分裂和合并操作,以保持树的平衡,存在冗余节点,使得删除的时候树结构变化小,更高效。 高度不会增长过快,查询磁盘I…

[大语言模型-论文精读] 悉尼大学-ACL2024-提升大型语言模型的复杂视觉推理能力

[大语言模型-论文精读] 悉尼大学-ACL2024-提升大型语言模型的复杂视觉推理能力 目录 文章目录 [大语言模型-论文精读] 悉尼大学-ACL2024-提升大型语言模型的复杂视觉推理能力目录论文简介0. 摘要2. 相关工作2.1 视觉-语言领域的推理研究2.2 用于视觉-语言分析的大型语言模型 3 …

如何通过SNP Glue简化SAP数据迁移至云数据湖?

有一种更简单的方法可以将关键SAP数据导入云数据湖,而不需要长时间的不可靠数据加载。您还可以仅发送自上次采集后更新的数据,接近于实时地复制数据。我们的专家将向您介绍他们如何使用SNP Glue为我们的客户实现这一点,包括: ■ …

如何提取b站的视频字幕,下载视频

打开视频地址 按F12打开—开发者工具 在开发者工具打开Network 过滤器关键字: 自动生成字幕:ai_subtitle 自制:json 打开/关闭字幕 刷新页面 找到字幕 点选字幕的respond 将方框中的内容复制; 复制到:https://www.drea…

无人机视角垃圾检测数据集,26700余张无人机图像,超过4万标注信息,共3.6GB数据量,可用于环卫快速检查,垃圾快速定位等应用。

无人机视角垃圾检测,26700余张无人机图像,超过4万标注信息,共3.6GB数据量,可用于环卫快速检查,垃圾快速定位等应用。 名称 无人机视角垃圾检测数据集 规模 图像数量:26700余张标注信息:超过4…

Kafak入门技术详解

抱歉,没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…

英语每日一句

每日一句 Confidence is contagious. So is a lack of confidence. 自信是有感染力的,缺乏自信也是。 文斯隆巴迪 今日单词 lack /lk/ v. 没有;缺乏 n. 缺乏,短缺;不足 词组: no lack of 不缺乏;…

快充慢充与超充:未来充电技术的三驾马车

快充、慢充与超充:未来电动汽车充电技术的三驾马车 随着电动汽车的普及,充电技术的快速发展成为推动这一行业进步的关键因素之一。快充、慢充和超充作为电动汽车充电技术的三大主流方式,各自具有独特的优势和应用场景。本文将深入探讨这三种…

ChatGPT+R语言强强联合,数据分析不再难!回归与混合效应模型、多元统计分析、结构方程模型(SEM)(lavaan)、Meta分析、贝叶斯回归等应用

目录 第一章 生态环境数据统计概述及基础 第二章 GPT&R:回归与混合效应模型 第三章 GPT&R:多元统计分析 第四章 GPT&R:结构方程模型(SEM)(lavaan) 第五章 GPT&R&#xff1…

EAdmin极简社区-基于LayUI模板制作的一套社区程序

EAdmin极简社区是基于LayUI模板制作的一套社区程序,后台支撑采用了ThinkPHP5框架。 增加了锁屏功能; 附件上传插件增加了进度条指示,并能根据需求上传大文件; 后台增加了积分记录和管理员操作记录; 前台编辑器增加…