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

server/2024/12/23 0:35:47/

策略设计模式

    • 一 .简介
    • 二. 案例
      • 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)类

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

2.2 具体策略(Concrete Strategy)类

飞机

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

铁路

java">/*** @author chenyunzhi* @date 2024/6/5 11:27* @Description 铁路*/
public class RailWay implements Strategy {@Overridepublic void way() {System.out.println("高铁出行");}
}

2.3 环境(Context)类

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

java">/*** @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 测试

java">/*** @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.ppmy.cn/server/126435.html

相关文章

关于鸿蒙next 调用系统权限麦克风

使用app的时候都清楚,想使用麦克风、摄像头,存储照片等,都需要调用系统的权限,没有手机操作系统权限你也使用不了app所提供的功能,虽然app可以正常打开,但是你需要的功能是没办法使用的。今天把自己在鸿蒙学…

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器(电位器模拟)采集光照信息 3、可…

Docker Init 实战详解:从入门到精通

1. 引言 在容器化应用开发的世界里,Docker 一直是首选工具。然而,对于初学者来说,创建 Dockerfile 和设置 Docker 环境可能是一个挑战。为了简化这个过程,Docker 引入了 docker init 命令。本文将深入探讨 Docker Init 的方方面面,从其诞生背景到高级应用,为您提供全面的…

玩转springboot之springboot定制化tomcat

定制化tomcat springboot中是集成了tomcat容器的,如何定制化内置的tomcat呢?springboot提供了定制化的接口 1.5.x版本 在1.5.x版本中使用的是EmbeddedServletContainerCustomizer接口来进行定制化的 public class MyTomcatCustomizer implements Embedde…

爬虫入门 Selenium使用

爬虫入门 & Selenium使用 特别声明📢:本教程只用于教学,大家在使用爬虫过程中需要遵守相关法律法规,否则后果自负!!! 项目代码:https://github.com/ziyifast/ziyifast-code_inst…

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元(GRU)门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元(GRU) 之前我们讨论了如何在循环神经网络中计算梯…

MySQL--数据库约束(详解)

目录 一、前言二、概念三、数据库约束3.1 约束类型3.1.1 NOT NULL 约束3.1.2 UNIQUE (唯一)3.1.3 DEFAULT(默认)3.1.4 PRIMARY KEY(主键)3.1.5 FOREIGN KEY(外键)3.1.6 CHECK 四、总结 一、前言…

Excel下拉菜单制作及选项修改

Excel下拉菜单 1、下拉菜单制作2、下拉菜单修改 下拉框(选项菜单)是十分常见的功能。Excel支持下拉框制作,通过预设选项进行菜单选择,可以避免手动输入错误和重复工作,提升数据输入的准确性和效率 1、下拉菜单制作 步…