深入理解 Java 设计模式之策略模式
一、引言
在 Java 编程的世界里,设计模式就如同建筑师手中的蓝图,能够帮助我们构建出更加健壮、灵活且易于维护的代码结构。而策略模式作为一种经典的行为型设计模式,在诸多实际开发场景中都发挥着至关重要的作用。它能够让算法的定义与使用分离,使得程序可以在运行时根据不同的需求灵活切换算法,就像我们出行时可以根据不同的路况选择步行、骑车、开车或乘坐公共交通等不同策略一样。本文将深入探讨 Java 设计模式中的策略模式,剖析其原理、结构、应用场景以及实际代码示例,希望能帮助读者深入理解并熟练运用这一强大的设计工具。
二、策略模式的定义与概念
策略模式(Strategy Pattern),也叫政策模式(Policy Pattern),它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。此模式让算法的变化独立于使用算法的客户,通过这种方式,算法的切换变得更加灵活,不会影响到客户端代码的稳定性。简单来说,就是把一个类中经常改变或者可能改变的部分提取出来,作为一个接口的实现类,而客户端代码则通过这个接口来调用相应的算法,而不用关心具体算法的实现细节。
三、策略模式的结构剖析
策略模式主要包含以下几个角色:
抽象策略角色(Strategy):
- 通常是一个接口或抽象类,定义了一个公共的策略方法,用于声明算法的规范。例如,在一个电商系统的折扣计算场景中,它可以定义一个calculateDiscount方法,用来计算订单的折扣金额。
- 代码示例:
public interface DiscountStrategy {double calculateDiscount(double totalPrice);}
具体策略角色(ConcreteStrategy):
- 实现了抽象策略角色所定义的接口或抽象类,具体实现了算法的细节。继续以电商系统为例,可能有NormalDiscountStrategy(无折扣策略,直接返回 0)、MemberDiscountStrategy(根据会员等级计算折扣)、SeasonalDiscountStrategy(根据季节推出不同折扣)等多个具体策略类。
- 代码示例:
public class NormalDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double totalPrice) {return 0;}}public class MemberDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double totalPrice) {// 假设根据会员等级打9折return totalPrice * 0.1;}}public class SeasonalDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscount(double totalPrice) {// 假设旺季无折扣,淡季打8折return totalPrice * (isOffSeason()? 0.2 : 0);}private boolean isOffSeason() {// 简单模拟判断是否淡季,实际应用中需更精准判断return false;}}
环境角色(Context):
- 持有一个抽象策略角色的引用,用于在运行时调用具体的策略算法。它维护了对策略对象的引用,并且负责将客户端的请求转发给对应的策略对象。在电商系统中,它可以是订单类,负责根据当前的业务规则选择合适的折扣策略并计算最终价格。
- 代码示例:
public class Order {private DiscountStrategy discountStrategy;public Order(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}public double calculateFinalPrice(double totalPrice) {double discount = discountStrategy.calculateDiscount(totalPrice);return totalPrice - discount;}}
通过这样的结构设计,各个部分职责分明。当业务需求发生变化,比如新增一种折扣策略时,只需要实现抽象策略接口,编写具体的策略类,而无需大规模改动环境角色和客户端代码,遵循了开闭原则。
四、策略模式的优势剖析
算法的可替换性:
- 由于策略模式将算法封装在独立的策略类中,当需要更换算法时,只需切换具体策略类的实例,而不会影响到客户端代码的其他部分。例如在游戏开发中,不同角色的移动行为可以定义为不同的策略,当设计新角色或修改角色移动方式时,轻松替换移动策略类即可,不会牵一发而动全身。
易于扩展:
- 新增算法非常方便,只需实现抽象策略接口,创建新的具体策略类。比如电商系统要增加新的促销折扣方式,按照策略模式的结构,简单几步就能集成到现有系统中,系统的可扩展性得到极大提升。
代码的复用性:
- 多个不同的业务场景可能用到相同的算法,将算法抽象为策略类后,可以在不同的环境角色中复用。以数据排序为例,无论是对用户列表排序,还是对商品列表排序,如果有多种排序算法(如冒泡排序、快速排序等)作为策略,这些排序算法类可以在不同的数据处理模块中重复利用。
符合开闭原则:
- 对扩展开放,对修改关闭。当业务需求变化导致算法调整时,通过新增具体策略类实现扩展,而无需修改原有稳定运行的代码,使得系统的维护成本降低,稳定性增强。
五、策略模式的应用场景实例
电商系统的促销策略:
- 如前文所述,电商平台在不同时期、针对不同用户群体有多样的促销活动。在 “双 11”“618” 等大促期间,全品类商品打折;对于新注册用户给予首单优惠;特定品牌或品类商品在淡季促销等。通过策略模式,将各种促销折扣算法封装,订单结算模块根据当前活动规则选择合适的折扣策略,轻松应对复杂多变的促销场景,保证系统的灵活性与可维护性。
游戏角色行为控制:
- 在角色扮演游戏中,不同角色具有不同的攻击、防御、移动方式。战士角色攻击可能是近身强力一击,法师角色则是远程魔法攻击;刺客角色移动敏捷,靠瞬移或高速奔跑接近敌人。将这些不同的行为定义为策略,角色类作为环境角色持有相应行为策略的引用,根据游戏进程和玩家操作切换策略,让游戏的设计更加模块化,方便后续新增角色或调整角色技能。
文件压缩工具:
- 一款支持多种格式压缩和解压缩的工具,如支持 ZIP、RAR、7Z 等格式。每种格式的压缩和解压缩算法不同,将这些算法封装成具体策略类,实现共同的压缩和解压缩接口(抽象策略),工具的主程序(环境角色)根据用户选择的文件格式调用对应的算法策略,实现了对不同格式文件的高效处理,同时方便后续添加新的压缩格式支持。
六、策略模式与其他设计模式的对比与关联
与工厂模式的对比:
- 工厂模式主要关注对象的创建过程,它根据不同的条件创建不同类型的对象,将对象的创建和使用分离。而策略模式侧重于算法的封装与切换,在运行时根据需求选择不同的算法实现。例如,在一个图形绘制系统中,工厂模式负责创建不同形状(圆形、矩形、三角形等)的图形对象,而策略模式可以用于处理不同图形的绘制算法(如使用不同的线条样式、填充颜色策略等)。二者虽然侧重点不同,但都有助于解耦代码,提高系统的灵活性。
与状态模式的关联:
- 状态模式中,对象的行为取决于它的内部状态,不同状态下有不同的行为表现,这与策略模式有相似之处,都是通过多态来实现不同行为的切换。但状态模式的重点在于状态的变迁,一个对象的状态改变会导致其行为自动切换,且状态之间可能存在转换逻辑;而策略模式更强调算法的平等替换,算法之间通常没有这种内在的状态转换关系。在一个订单处理系统中,订单的状态(已下单、已支付、已发货等)不同,处理流程不同,这适合用状态模式;而订单计算折扣时采用不同的折扣算法,就是策略模式的应用场景,二者可以结合使用,比如在不同订单状态下应用不同的折扣策略。
七、策略模式在 Java 核心库与开源框架中的应用
Java 集合框架中的排序算法:
- 在java.util.Collections类中,sort方法用于对列表进行排序。它采用了策略模式,允许用户传入自定义的比较器(Comparator接口,相当于抽象策略)来定义排序规则。如果要按照对象的某个特定属性排序,只需实现Comparator接口,编写具体的比较逻辑(具体策略),就可以灵活地对集合中的元素进行排序,这充分体现了策略模式的算法可替换性优势。
Spring 框架中的事务管理策略:
- Spring 在事务管理方面运用了策略模式。它定义了事务策略的抽象接口,不同的事务实现(如基于 JDBC 的事务、基于 JTA 的事务等)作为具体策略类。当应用配置事务时,Spring 容器根据配置信息选择合适的事务策略,为业务代码提供统一的事务支持,使得在不同的运行环境和需求下都能高效管理事务,保证数据的一致性和完整性。
八、策略模式的实践注意事项
策略类的数量控制:
- 虽然策略模式方便扩展,但如果过度使用,导致策略类数量过多,会使代码变得复杂难以维护。在设计时,要综合考虑业务的复杂性和未来的可扩展性,避免为了微小的算法差异就创建独立的策略类。例如,一些简单的数值计算调整,如果可以通过参数配置解决,就不一定非要新增策略类。
策略类的共享与复用:
- 要注意识别可以复用的策略类,避免重复创建功能相同的策略。可以将一些通用的策略类提取到工具类库中,供不同的模块使用。比如常见的字符串加密解密策略,在多个涉及用户数据安全的模块中都可能用到,统一管理复用能减少代码冗余。
与依赖注入的结合:
- 在实际项目中,通常将策略类通过依赖注入的方式注入到环境角色中,这样可以更好地解耦策略类与环境类,方便在不同场景下切换策略。例如使用 Spring 的依赖注入框架,将折扣策略类注入到订单服务类中,在配置文件或注解中灵活指定要使用的策略,提升代码的灵活性与可测试性。
九、总结
策略模式作为 Java 设计模式中的一颗璀璨明珠,以其灵活的算法封装、强大的可扩展性、良好的代码复用性以及对开闭原则的完美遵循,为 Java 开发者提供了解决复杂业务逻辑的有力武器。通过深入理解策略模式的定义、结构、优势、应用场景以及在实践中的注意事项,我们能够在面对多变的业务需求时,游刃有余地设计出高质量、易维护的代码架构。无论是构建大型企业级应用,还是开发小型工具类项目,策略模式都有着广泛的用武之地,希望本文能成为读者掌握这一设计模式的坚实基石,助力大家在 Java 编程之路上越走越远。
相关文章:
深入理解 Java 设计模式之策略模式
一、引言 在 Java 编程的世界里,设计模式就如同建筑师手中的蓝图,能够帮助我们构建出更加健壮、灵活且易于维护的代码结构。而策略模式作为一种经典的行为型设计模式,在诸多实际开发场景中都发挥着至关重要的作用。它能够让算法的定义与使用…...
如何快速导出Python包和安装?
pip freeze > requirements.txt导出: 安转 : pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple...
记录一个在增量更新工具类
1. 应用场景 比方说我现在有一个商品,这个商品可以上传图片用来展示,之前已经上传过5张图片 ABCDE,现在其中BC这两张图片不想要了要换成FG,这个时候就可以使用这个工具类进行更新。 在最后一步,可以不管ADE直接只管新增…...
VUE3 常用的组件介绍
Vue 组件简介 Vue 组件是构建 Vue 应用程序的核心部分,组件帮助我们将 UI 分解为独立的、可复用的块,每个组件都有自己的状态和行为。Vue 组件通常由模板、脚本和样式组成。组件的脚本部分包含了各种配置选项,用于定义组件的逻辑和功能。 组…...
UML系列之Rational Rose笔记二:包图
rose绘制包图,有简单的有复杂的; 正常图简单的话,直接新建package使用就行,改变package的大小,改变名称当作不同的包就行;基本没有什么学习难度;在此,笔者直接介绍一下回执标准一点…...
第34天:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法
时间轴: Java反射相关类图解: 反射: 1、什么是 Java 反射 参考: https://xz.aliyun.com/t/9117 Java 提供了一套反射 API ,该 API 由 Class 类与 java.lang.reflect 类库组成。 该类库包含了 Field 、 Me…...
cuda实现flash_attn_mma_share_kv源码分析
一 源码分析 1.1 函数入口 void flash_attn_mma_stages_split_q_shared_kv(torch::Tensor Q, torch::Tensor K, torch::Tensor V, torch::Tensor O, int stages) {CHECK_TORCH_TENSOR_DTYPE(Q, torch::kHalf) // Q [B,H,N,D]CHECK_TORCH_TENSOR_DTYPE(K, torch::kHalf) // K …...
Python操作Excel的库openpyxl使用入门
openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。以下是一些 openpyxl 的基本使用方法: 安装 openpyxl 首先,确保已经安装了 openpyxl。如果没有安装,可以使用以下命令进行安装: pip install openp…...
《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)
《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…...
信息网络安全考试gjdw
序号 一级纲要 二级纲要 题目分类 题型 题干 选项 答案 题目依据 试题分数 试题编码 备注 说明 1 信息安规 \ 专业题库 单选题 根据信息安规规定,试验和推广信息新技术,应制定相应的( ),经本单位…...
S变换matlab实现
S变换函数 function [st,t,f] st(timeseries,minfreq,maxfreq,samplingrate,freqsamplingrate) % S变换 % Code by huasir Beijing 2025.1.10 % Reference is "Localization of the Complex Spectrum: The S Transform" % from IEEE Transactions on Signal Proc…...
【OLAP和PLTP】—— 浅谈两者的应用场景和区别
大家好,我是摇光~ OLAP(Online Analytical Processing)和OLTP(Online Transaction Processing)是两种不同的数据处理技术,分别用于不同的业务场景。以下是关于OLAP和OLTP的详细介绍: 一、OLAP&…...
计算机组成原理(1)王道学习笔记
一、 引言 计算机硬件唯一能识别的数据是二进制-----0/1。 用低/高电平表示0/1。 通过很多条电路,可以传递多个二进制数位。 每个二进制数位称为1bit(比特)。 计算机硬件的基本组成 早期的ENIAC计算机是通过手动接线来控制计算。冯诺依曼首次…...
LLaMA模型:自然语言处理的革新者
引言 在人工智能的领域中,自然语言处理(NLP)是一个充满挑战的分支,它的目标是让计算机能够理解和生成人类语言。Transformer模型,作为NLP的基石,已经极大地推动了这一领域的发展。然而,为了进一…...
各种特种无人机快速发展,无人机反制技术面临挑战
随着科技的飞速发展,各种特种无人机在军事、民用等领域得到了广泛应用,其性能不断提升,应用场景也日益丰富。然而,无人机反制技术的发展确实面临一定的挑战,难以完全跟上无人机技术的快速发展步伐。以下是对这一问题的…...
1555银行账户概要_pandas解答
目录 题目链接(无_力扣VIP_略过)一.读题(建议使用这种表结构_数据对比看)题目SQL Schema & Pandas Schema 建表语句_数据 二.答案_MySQL一图解MySQL一图解__可只需看此!!!!!!!!!!!!!!!!答案-----------------------------------------------------------------------------…...
【C++补充】第一弹---位图技术揭秘:内存优化与快速访问
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1 位图 1.1 位图相关面试题 1.2 位图的设计及实现 1.3 C库中的位图 bitset 1.4 位图的模拟实现 1.5 位图的优缺点 1.6 位图相关考察题目 1 …...
node.js中实现token的生成与验证
Token(令牌)是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中,Token常用于身份验证和授权,确保用户能够安全地访问受保护的资源。 作用与意义 身份验证:Token可以用来验证用户的身份࿰…...
服务器登陆后有java变量
需求:在ssh服务器后,用户root 使用java会报错,没有这个变量,其实环境变量中已经有配置了,在/etc/profile 中有写变量及地址,通过source /etc/profile 命令也可以使环境变量加载上,但是ssh后不会…...
层次模型式的工作流
层次模型式的工作流是一种适合分布式版本控制系统(如 Git、Mercurial)的开发协作方式,它将开发团队分成多个层次,每个层次有明确的角色和职责,代码从底层逐步向上层汇总和集成,最终形成一个完整、稳定的产品…...
Linux 发行版介绍与对比:Red Hat、Ubuntu、Kylin、Debian
Linux 操作系统有众多发行版(Distros),每个发行版的设计目标、目标用户、应用场景和使用方式有所不同。常见的 Linux 发行版包括 Red Hat、Ubuntu、Kylin 和 Debian。以下是这些发行版的详细介绍与对比,以及它们的应用场景和使用方…...
G1原理—3.G1是如何提升垃圾回收效率
大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7.DCQS机制及GC线程对DCQ的处理 提升G1垃圾回收器GC效率的黑科技 G1设计了一套TLAB机制 快速…...
IOS界面传值-OC
1、页面跳转 由 ViewController 页面跳转至 NextViewController 页面 (1)ViewController ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend ViewController.m #import "ViewController.h" …...
C# SQL ASP.NET Web
留学生的课程答疑 按照要求完成程序设计、数据库设计、用户手册等相关技术文档; 要求 1. 计算机相关专业,本科以上学历,至少有1年以上工作经验或实习经历。 2. 熟练掌握WinForm程序开发,或ASP.NET Web编程。 3. 熟悉C#中网络…...
asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?
对于并发请求,每个请求会被分配到一个独立的线程或线程池工作线程上。通过 HttpContext 或 AsyncLocal,每个线程都能独立地获取到它自己的上下文数据。由于这些数据是与当前请求相关的,因此在并发请求时不会互相干扰。 在并发请求时…...
软件23种设计模式完整版[附Java版示例代码]
一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…...
FPGA 20 ,FPGA按键消抖功能解析与实现
目录 前言 一. 具体场景 二. 消抖方法...
基于单片机的无线气象仪系统设计(论文+源码)
1系统方案设计 如图2.1所示为无线气象仪系统设计框架。系统设计采用STM32单片机作为主控制器,结合DHT11温湿度传感器、光敏传感器、BMP180气压传感器、PR-3000-FS-N01风速传感器实现气象环境的温度、湿度、光照、气压、风速等环境数据的检测,并通过OLED1…...
OA系统如何做好DDOS防护
OA系统如何做好DDOS防护?在数字化办公蔚然成风的当下,OA(办公自动化)系统作为企业内部管理与协作的神经中枢,其安全性和稳定性直接关系到企业的日常运营效率、信息流通效率以及长远发展。OA系统不仅承载着企业内部的日…...
java_单例设计模式
什么是设计模式 什么是单例设计模式 单例设计模式——饿汉式 虽然你没有使用这个对象实例,但是它也帮你创建了!容易造成对象的浪费 對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用. package com.hspedu.singl…...
比较分析:Windsurf、Cody、Cline、Roo Cline、Copilot 和 通义灵码
随着人工智能技术的快速发展,开发者工具变得越来越智能化,特别是在代码生成、辅助编程等领域,市面上涌现了多种 AI 驱动的工具。本文将从开源性、集成能力、功能覆盖范围、支持的编程语言、生态兼容性、成本、学习曲线、响应速度、离线支持以…...
vue3后台系统动态路由实现
动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。 1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式 后端返回路由如下: …...
C#版 软件开发6大原则与23种设计模式
开发原则和设计模式一直是软件开发中的圣经, 但是这仅仅适用于中大型的项目开发, 在小型项目的开发中, 这些规则会降低你的开发效率, 使你的工程变得繁杂. 所以只有适合你的才是最好的. 设计模式六大原则1. 单一职责原则(Single Responsibility Principle࿰…...
后端Java开发:第十三天
第十三天:继承 - 面向对象的核心概念 欢迎来到第十三天的学习!今天,我们将深入探讨 Java 中的 继承(Inheritance),这是面向对象编程的四大基本特性之一。继承是指一个类(子类)通过继…...
awr报告无法生成:常见分析手段
awr报告无法生成:常见分析手段 STATISTICS_LEVEL和OPEN_MODEAWR快照是否能自动生成?AWR快照能否手动生成?日志有无ORA-12751或ORA-32701报错?MMON进程是否被挂起?排查数据库隐藏参数分析快照生成错误信息分析AWR Snapshot Tracing分析AWR Table Flush是否超时STATISTICS_L…...
基础算法——差分
原理与特点 先回顾一下前缀和算法。 | arr | 1 | 3 | 7 | 5 | 6 | | ---------- | ------ | ------ | ------ | ------ | ------ | | prefix 值 | 101 | 134 | 13711 | 137516 | 1375622 |前缀和的特点是前面的相加prefix(i)sum(i-1)arr(i)。那么差分数组diff就如下面的形式 |…...
[ LeetCode 75 ] 283 移动零(JavaScript)
283 移动零 题目描述解题思路步骤解析时间和空间复杂度代码实现 题目描述 LeetCode 283 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操…...
YOLOv10改进,YOLOv10添加HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超分辨率重建
摘要 基于Transformer的方法在低层视觉任务中表现出色,例如图像超分辨率。然而,作者通过归因分析发现,这些网络只能利用有限的空间范围的输入信息。这意味着现有网络尚未充分发挥Transformer的潜力。为了激活更多的输入像素以获得更好的重建效果,作者提出了一种新型的混合…...
VS调试MFC进入系统源代码配置
调试MFC代码有时候能进入MFC的源代码,有时候不能.之前一直没有深入研究.后面经过查资料发现每次调试必能进入源代码的配置.很简单,只需要3步. 1.打开工具->选项->调试->符号,勾选Microsoft符号服务器. 2.打开项目->属性->配置属性->常规,MFC的使用修改成&qu…...
C# 告别FirstOrDefault
一、开篇:FirstOrDefault 的 “江湖地位” 在 C# 编程的世界里,FirstOrDefault 可谓是一位 “常客”,被广大开发者频繁地运用在各种项目场景之中。无论是 Windows 窗体应用程序,需要从数据集中检索第一条记录,或是满足…...
图像处理|腐蚀操作
在计算机视觉与图像处理中,腐蚀操作(Erosion)是形态学操作的一种。形态学操作广泛应用于二值图像中,主要用于分析和提取图像中的结构信息。腐蚀操作是这类操作中最常见的一种,用来对图像进行“收缩”处理,消…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(应用)
实战训练1—报数游戏 问题描述: 小明和小鹏玩报数游戏,小明按1∼20 报数,小鹏按1∼30报数。若两人同时开始,并以同样的速度报数,当两人都报了1000个数时,同时报相同数的次数是多少呢? 输入格…...
140.WEB渗透测试-信息收集-小程序、app(11)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:139.WEB渗透测试-信息收集-小程序、app(10) 3.直接有app 直接拿…...
《新闻大厦抢先版》V0.18.105+Dlcs官方学习版
《新闻大厦抢先版》官方版https://pan.xunlei.com/s/VODaeUn3v-ZWVvvmUMfo5AqWA1?pwdnhpz# 建造并不断优化新闻大楼,保障员工权益并及时赶上周日的印刷交期! 招募并管理不同职业以登上成功的阶梯:记者、摄像师、勤杂工,除此以外…...
【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象
一、prop校验 如果我们在想要限制prop的类型,就可以在接收prop的时候对接收类型进行限制: defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制,只会在后台进行提示: 二、…...
Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单,选择 要创建的项目模版,点击 Next 二、输入项目名称…...
Spring Boot | 基于MinIO实现文件上传和下载
关注:CodingTechWork 介绍 在现代的 web 应用中,文件上传和下载是常见的需求。MinIO 是一个开源的高性能分布式对象存储服务,可以用来存储和管理大量的非结构化数据,如图片、视频、日志文件等。本文将介绍如何在 Spring Boot 应用…...
【DNS 阿里云,域名解析,解析到IP的指定端口】
- 进入 阿里云域名解析界面 - 点击 解析设置 - 添加记录 1.添加一条 A/AAAA 类型解析你的服务器的IP地址(不需要带端口号,这条解析只是起到中转作用) 示例:主机记录:aa.bb.com 记录值:xxx.xxx.xxx.xxx (…...
力扣经典二分题:4. 寻找两个正序数组的中位数
题目链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode) 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是:int m nums1.size(),n nums2.size();中位数性质1:中位数左侧元素 …...
Java Web开发进阶——Spring Boot与Spring Data JPA
Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。在结合 Spring Boot 使用时,开发者能够快速完成数据库访问层的开发。 1. 介绍Spring Data JPA 1.1 什么是Spr…...