【设计模式】策略模式(定义 | 特点 | Demo入门讲解)

文章目录

    • 定义
      • 策略模式的结构
    • QuickStart | Demo
      • Step1 | 策略接口
      • Step2 | 策略实现
      • Step3 | 上下文服务类
      • Step4 | 客户端
    • 策略模式的特点
      • 优点
      • 缺点

定义

策略模式Strategy是一种行为模式,它能定义一系列算法,并将每种算法分别放入到独立的类中,以使算法的对象能够相互替换。

image-20240703105735219

比如,你去机场,可以有三种策略:

  • 自行车
  • 公共汽车
  • 出租车

这三种交通方案,自行车不要钱,能欣赏风景;公共汽车便宜速度快;出租车方便速度快,节省时间。这三种方案代表了三种策略,算法。

将上面三种出行方案封装,我们可以灵活选用!

策略模式的结构

image-20240703110024689

通过上图我们知道,策略模式分为四个结构:

  • 策略接口【核心】
  • 策略实现类
  • 上下文Context
    • 具体要实现的业务代码,业务逻辑。
  • 客户端Client
    • 决定使用哪种策略。

QuickStart | Demo

接下来用一个非常容易理解的案例让大家掌握策略模式。

项目结构如下:

├─.idea
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─linghu
│ │ │ └─designer
│ │ │ ├─dao
│ │ │ │ └─impl
│ │ │ └─service
│ │ └─resources
│ └─test
│ └─java
└─target
├─classes
│ └─com
│ └─linghu
│ └─designer
│ ├─dao
│ │ └─impl
│ └─service
└─generated-sources
└─annotations

Step1 | 策略接口

首先定义一个策略接口,这里面封装了数据访问层Dao层的策略方法。

/*** @author linghu* @date 2024/7/3 10:27*/
/*策略接⼝*/
public interface UserDao {public void insert();public void update();public void delete();public void findById();
}v

Step2 | 策略实现

面向客户,用户,开发者的时候,我们可以选择不同的数据访问方式,我们可以选择:

  • JDBC
  • JNDI
  • ODBC

具体怎么选,我们需要再客户端让用户自己选。那么在这里我们需要定义好这三种策略实现类。

image-20240703110956122

/*** @author linghu* @date 2024/7/3 10:28*/
public class JdbcDao implements UserDao {@Overridepublic void insert() {System.out.println("JDBC⽅式实现数据插⼊");}@Overridepublic void update() {System.out.println("JDBC⽅式实现数据更新");}@Overridepublic void delete() {System.out.println("JDBC⽅式实现数据删除");}@Overridepublic void findById() {System.out.println("JDBC⽅式实现数据查找");}
}
package com.linghu.designer.dao.impl;import com.linghu.designer.dao.UserDao;/*** @author linghu* @date 2024/7/3 10:28*/
public class JndiDao implements UserDao {@Overridepublic void insert() {System.out.println("JndiDao⽅式实现数据插⼊");}@Overridepublic void update() {System.out.println("JndiDao⽅式实现数据更新");}@Overridepublic void delete() {System.out.println("JndiDao⽅式实现数据删除");}@Overridepublic void findById() {System.out.println("JndiDao⽅式实现数据查找");}
}
package com.linghu.designer.dao.impl;import com.linghu.designer.dao.UserDao;/*** @author linghu* @date 2024/7/3 10:28*/
public class JndiDao implements UserDao {@Overridepublic void insert() {System.out.println("JndiDao⽅式实现数据插⼊");}@Overridepublic void update() {System.out.println("JndiDao⽅式实现数据更新");}@Overridepublic void delete() {System.out.println("JndiDao⽅式实现数据删除");}@Overridepublic void findById() {System.out.println("JndiDao⽅式实现数据查找");}
}
package com.linghu.designer.dao.impl;import com.linghu.designer.dao.UserDao;/*** @author linghu* @date 2024/7/3 10:28*/
public class OdbcDao implements UserDao {@Overridepublic void insert() {System.out.println("OdbcDao⽅式实现数据插⼊");}@Overridepublic void update() {System.out.println("OdbcDao⽅式实现数据更新");}@Overridepublic void delete() {System.out.println("OdbcDao⽅式实现数据删除");}@Overridepublic void findById() {System.out.println("OdbcDao⽅式实现数据查找");}
}

Step3 | 上下文服务类

上下文服务,持有某个策略对象dao,但是策略通过外部传入,服务类本身主要完成业务逻辑 insert()

/*** @author linghu* @date 2024/7/3 10:33*/
/*Context*/
public class UserService {public UserDao dao = null;public UserService(UserDao dao) {this.dao = dao;}public void createUser(){System.out.println("正在创建⽤户对象");dao.insert();}
}

在这里,我们的策略是通过外部传入的:

    public UserService(UserDao dao) {this.dao = dao;}

外部策略通过 UserDao dao传入。

Step4 | 客户端

客户端代码如下:


/*** @author linghu* @date ${DATE} ${TIME}*/
public class Client {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();UserDao dao = null;switch (input) {case "jdbc":dao = new JdbcDao();break;case "odbc":dao = new OdbcDao();break;case "jndi":dao = new JndiDao();break;}//策略的创建者在用户端!UserService userService = new UserService(dao);userService.createUser();}
}

根据文本的不同创建不同的策略:

switch (input) {case "jdbc":dao = new JdbcDao();break;case "odbc":dao = new OdbcDao();break;case "jndi":dao = new JndiDao();break;}

策略模式的特点

优点

image-20240703141539988

缺点

image-20240703141557729

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

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

相关文章

书籍表达式得到期望结果的组成种数

题目 给定一个只由0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种组成的字符串express,再给定一个布尔值desired。返回express能有多少种组合方式。可以达到desired的结果。 举例 express“1^0|0|1”,desiredfalse. 只有1^((0|0)|1)和1^(0|(0|1))的组合可…

负载均衡类型和算法解析

假如你正在设计和开发一个分布式服务系统,系统中存在一批能够独立运行的服务,而在部署上也采用了集群模式以防止出现单点故障。所谓集群,就是指将多个服务实例集中在一起,对外提供同一业务功能,也就是任意请求都可以由…

吉利银河L6 AQS空气质量监控系统

结论 顶配才有AQS 开启空调且auto模式 则默认开启AQS 无法关闭AQS AQS的作用 银河L6 AQS触发 和 图标 AQS官方配置参数 官方文档 吉利用户手册

开源即正义,3D软件Blender设计指南

在当今数字化时代,开源软件的崛起不仅代表着技术的发展,更象征着一种信息自由和技术民主的理念。其本质是集众人之智,共同去完善一个软件,最终使双方互惠共赢。具体来说,开源的价值,在于打破资源垄断&#…

Spring的事务管理、AOP实现底层

目录 spring的事务管理是如何实现的? Spring的AOP的底层实现原理 spring的事务管理是如何实现的? 首先,spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑&#xf…

NLP - 基于bert预训练模型的文本多分类示例

项目说明 项目名称 基于DistilBERT的标题多分类任务 项目概述 本项目旨在使用DistilBERT模型对给定的标题文本进行多分类任务。项目包括从数据处理、模型训练、模型评估到最终的API部署。该项目采用模块化设计,以便于理解和维护。 项目结构 . ├── bert_dat…

苹果AI的国产大模型之争,没有悬念

文 | 智能相对论 作者 | 陈泊丞 苹果终于公布了最新的AI进程。 一个月前,正如此前预期的那样,人工智能是今年 WWDC 发布会的焦点。全程105分钟的主题演讲,就有40多分钟用于介绍苹果的AI成果。 苹果似乎还有意玩了一把“谐音梗”&#xff…

用机器改变人类方向

1800 世纪初,美国迎来了工业革命,这是一个由技术进步推动的变革时代。新机器和制造技术的引入重塑了经济格局,提高了生产效率,同时减少了某些领域对手工劳动的需求。因此,这种转变导致了失业。 如今,我们看…

实现点击按钮导出页面pdf

在Vue 3 Vite项目中,你可以使用html2canvas和jspdf库来实现将页面某部分导出为PDF文档的功能。以下是一个简单的实现方式: 1.安装html2canvas和jspdf: pnpm install html2canvas jspdf 2.在Vue组件中使用这些库来实现导出功能:…

统计信号处理基础 习题解答11-11

题目 考虑矢量MAP估计量 证明这个估计量对于代价函数 使贝叶斯风险最小。其中:, ,且. 解答 贝叶斯风险函数: 基于概率密度的非负特性,上述对积分要求最小,那就需要内层积分达到最小。令内层积分为: 上述积…

苹果Mac电脑能玩什么游戏 Mac怎么运行Windows游戏

相对于Windows平台来说,Mac电脑可玩的游戏较少。虽然苹果设备的性能足以支持各种大型游戏,但由于系统以及苹果配套服务的限制,很多游戏无法在Mac系统中运行。不过,借助虚拟机软件,Mac电脑可以突破系统限制玩更多的游戏…

react中jsx的语法规则

1.react核心库react.development.js 2.react_dom库,用于支持react操作dom(react-dom.development.js) 3.引入bable,解析jsx语法的库,用于将jsx转换为js(babel.min.js) 上述三个库是写基础react的基本库 下面我将用…

光照老化试验箱在化工产品暴晒测试中的应用

概述 光照老化试验箱是一种模拟自然光照条件下材料老化情况的实验设备,广泛应用于化工、建材、电子、汽车等行业中对材料的耐候性、耐光性能等进行测试。通过模拟日光中的紫外线和温度等环境因素,加速材料老化过程,以此评估材料在长期使用中…

2024阿里云大模型自定义插件(如何调用自定义接口)

1,自定义插件入口 2,插件定义:描述插件的参数 2.1,注意事项: 2.1.1,只支持json格式的参数;只支持application/JSON;如下图: 2.1.2,需要把接口描述进行修改&a…

03:Spring MVC

文章目录 一:Spring MVC简介1:说说自己对于Spring MVC的了解?1.1:流程说明: 一:Spring MVC简介 Spring MVC就是一个MVC框架,Spring MVC annotation式的开发比Struts2方便,可以直接代…

LeetCode 算法:二叉搜索树中第K小的元素 c++

原题链接🔗:二叉搜索树中第K小的元素 难度:中等⭐️⭐️ 题目 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从1开始计数)。 示例 1:…

网络爬虫之什么是代码混淆?初步理解代码混淆

爬虫逆向之什么是代码混淆?初步理解代码混淆 在网络爬虫和逆向工程的过程中,代码混淆是一项常见的技术,旨在保护代码不被轻易理解和逆向。对于爬虫工程师来说,理解并破解代码混淆是一个重要的技能。本文将详细介绍代码混淆的基本概…

GUI开发

Question One Java 实现动作监听,网格布局添加四个按钮,实现四个不同的文本显示 import java.awt.*; import java.awt.event.*; import javax.swing.*;class myGUI extends JFrame implements ActionListener{private Button b1, b2, b3, b4;private Tex…

0627,0628,0629,排序,文件

01:请实现选择排序,并分析它的时间复杂度,空间复杂度和稳定性 void selection_sort(int arr[], int n); 解答: 稳定性:稳定, 不稳定的,会发生长距离的交换 4 9 9 4 1 &#xf…

ubuntu,linux下屏蔽坏块方法-240625-240702封存

在windows下的屏蔽坏道的方法 机械硬盘坏道的文件系统级别的屏蔽方法_硬盘如何屏蔽坏扇区-CSDN博客 https://blog.csdn.net/cyuyan112233/article/details/139408503?spm1001.2014.3001.5502 【免费】磁盘坏道屏蔽工具磁盘坏道屏蔽工具_机械硬盘屏蔽坏扇区资源-CSDN文库 https…