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

news/2024/10/4 15:53:03/

策略设计模式

    • 一 .简介
    • 二. 案例
      • 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/news/1534493.html

相关文章

Docekrfile和docker compose编写指南及注意事项

Dockerfile 基础语法 我们通过编写dockerfile,将每一层要做的事情使用语法固定下来,之后运行指令就可以通过docker来制作自己的镜像了。 构建镜像的指令:docker build /path -t imageName:tag 注意,docker build后的path必须是dockerfile…

关于Elastic Search与MySQL之间的数据同步

目录 前言 思路分析 同步调用 异步通知 监听binlog 选择 实现数据同步 思路 运行项目 声明交换机、队列 1)引入依赖 2)声明队列交换机名称 3)声明队列交换机 发送MQ消息 接收MQ消息 前言 Elastic Search中的酒店数据来自于MyS…

创建实体类pojo实现Serializable接口

案例如下: 一、什么是Serializable接口 在 Java 中,Serializable 接口是一个标记接口,它的主要作用是指示一个类的对象可以被序列化。 序列化是将对象转换为字节流的过程,以便将其保存到文件、通过网络传输或存储在数据库中&…

(C语言贪吃蛇)14.用绝对值方式解决不合理的走位

目录 前言 解决方式 运行效果 总结 前言 我们上节实现了贪吃蛇四方向走位,但是出现了一些不合理的走位,比如说身体节点和头节点重合等等,本节我们便来解决这个问题。 我们希望贪吃蛇撞到自身时游戏会重新开始,并且贪吃蛇的运动方…

【Kubernetes】常见面试题汇总(四十七)

目录 106.考虑一种情况,公司希望通过保持最低成本来提高效率和技术运营速度。您如何看待公司将如何实现这一目标? 107.假设一家公司想要修改其部署方法,并希望构建一个可扩展性和响应性更高的平台。您如何看待这家公司能够实现这一目标以满足…

日常工作技术点总结

1&#xff0c;在el-input中只能输入数值与小数点&#xff0c;且不会有其他的校验影响 //在模板中 <el-col :span"7"><el-form-item label"建设单位支付(元)" prop"unitAmount" label-width"120px">el-input v-model"…

如何突破科技服务领域的客户管理困境?

在知识产权与科技服务领域&#xff0c;企业面临着独特的客户管理需求和挑战&#xff0c;这些挑战不仅要求高度的专业性和精细化操作&#xff0c;还涉及复杂的法律流程、数据保密性以及不断变化的客户需求。传统的客户管理方式&#xff0c;如纸质档案、简单的电子表格或人工处理…

初识Linux · 进程替换

目录 前言&#xff1a; 1 直接看代码和现象 2 解释原理 3 将代码改成多进程版本 4 认识所有函数并使用 前言&#xff1a; 由前面的章节学习&#xff0c;我们已经了解了进程状态&#xff0c;进程终止以及进程等待&#xff0c;今天&#xff0c;我们学习进程替换。进程替换我…