【设计模式】策略模式(定义 | 特点 | 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,一经查实,立即删除!

相关文章

负载均衡类型和算法解析

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

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

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

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

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

苹果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电脑可以突破系统限制玩更多的游戏…

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

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

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:…

第一周题目总结

1.车尔尼有一个数组 nums ,它只包含 正 整数,所有正整数的数位长度都 相同 。 两个整数的 数位不同 指的是两个整数 相同 位置上不同数字的数目。 请车尔尼返回 nums 中 所有 整数对里,数位不同之和。 示例 1: 输入&#xff1a…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示网络时间

LCD ST7735显示网络时间 文章目录 LCD ST7735显示网络时间1、硬件准备2、代码实现本文将介绍如何使用 ESP8266 NodeMCU Wi-Fi 板实现互联网时钟,其中时间和日期显示在 ST7735 TFT 显示屏上。 ST7735 TFT是一款分辨率为128160像素的彩色显示屏,采用SPI协议与主控设备通信。 1…

SQL语句(DML)

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改等操作 DML-添加数据 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

AI 与数据的智能融合丨大模型时代下的存储系统

WOT 全球技术创新大会2024北京站于 6 月 22 日圆满落幕。本届大会以“智启新纪,慧创万物”为主题,邀请到 60 位不同行业的专家,聚焦 AIGC、领导力、研发效能、架构演进、大数据等热门技术话题进行分享。 近年来,数据和人工智能已…

记录搭建一台可域名访问的HTTPS服务器

一、背景 近期公司业务涉及到微信小程序,即将开发完成需要按照微信小程序平台的要求提供带证书的域名请求服务器。 资源背景介绍如下: 1、域名 公司已有一个二级域名,再次申请新的二级域名并且实现ICP备案不仅需要花重金重新购买,…

Docker实现Redis主从,以及哨兵机制

Docker实现Redis主从,以及哨兵机制 目录 Docker实现Redis主从,以及哨兵机制准备Redis镜像创建Redis主节点配置文件启动Redis从节点确认主从连接哨兵主要功能配置哨兵文件创建Redis哨兵的Docker容器 要通过Docker实现Redis的主从(master-slave)复制&#…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一,旗下拥有BMW、MINI和Rolls-Royce三大品牌;同时提供汽车金融和高档出行服务。作为一家全球性公司,宝马集团在14个国家拥有31家生产和组装厂,销售网络遍及140多个国家和地区。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作? 在网络和互联网协议领域,有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具,它代表套接字安全版本 5。 在这篇博文中,我们将深入探讨 SOCKS5 的细节&…