设计模式-规格模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 规格模式和策略模式的区别和联系
    • 代码示例
      • Java实现规格模式
      • Python实现规格模式
    • 规格模式在spring中的应用


模式介绍

规格模式(Specification Pattern)是一种行为设计模式,其目的是将业务规则封装成可重用的对象,并能够动态地组合这些规则,以实现更复杂的业务逻辑。规格模式的基本介绍如下:

  1. 定义:规格模式可以认为是组合模式的一种扩展。在程序中,某些条件决定了业务逻辑,这些条件可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。这里的每个条件都是一个规格,多个规格(条件)通过串联的方式以某种逻辑关系形成一个组合式的规格。规格模式属于结构型设计模式。
  2. 意图:将一个业务规则表示为一个对象,并且将多个规则组合成更为复杂的规则。该模式可以将规则的表示与规则的实现分离,从而实现可扩展性、可维护性和可重用性。
  3. 应用场景:
  • 验证对象:检验对象本身是否满足某些业务要求或者是否已经为实现某个业务目标做好了准备。
  • 从集合中选择符合特定业务规则的对象或对象子集。
  • 指定在创建新对象的时候必须要满足某种业务要求。

规格模式是一种常用的软件设计模式,通过将业务规则封装成可重用的对象并动态组合,可以灵活地定制业务逻辑,简化实现过程,提高系统的可维护性和可扩展性。

在这里插入图片描述

模式特点

规格模式的特点主要有以下几个方面:

  1. 可维护性:规格模式将业务规则进行抽象和组合,使得规则的实现与表示分离,便于业务规则的维护和更新。
  2. 可扩展性:通过组合多个规则,规格模式可以实现更为复杂的规则,从而支持业务的变化和扩展。
  3. 可重用性:将业务规则封装成对象,可以在不同的场景中进行复用,从而减少代码冗余。
  4. 复杂性:规格模式的实现过程较为复杂,需要花费一定的时间和精力。
  5. 灵活的业务逻辑定制:规格模式允许通过组合多个规格来灵活地定制业务逻辑,这在查询、过滤等应用场合中尤其有用。
  6. 适合从集合中选择对象:规格模式非常适合在多个对象中筛选查找,或者在业务规则不适于放在任何已有实体或值对象中,而且规则变化和组合会掩盖对象的基本含义的情况。

规格模式提供了一种结构化的方式来组合和表示业务规则,使得系统更具可维护性、可扩展性和可重用性。同时,这种模式也有助于简化实现逻辑,并使得业务逻辑更加灵活和可定制。

在这里插入图片描述

应用场景

规格模式主要适用于以下应用场景:

  1. 验证对象:检验对象本身是否满足某些业务要求或者是否已经为实现某个业务目标做好了准备。
  2. 从集合中选择符合特定业务规则的对象或对象子集
  3. 指定在创建新对象的时候必须要满足某种业务要求

规格模式主要应用于需要根据一系列的业务规则来对对象进行筛选、过滤、匹配或组合的场景中。这些场景需要能够灵活地定义和组合规则,以应对业务需求的变化和扩展。

在这里插入图片描述

规格模式和策略模式的区别和联系

规格模式和策略模式是两种不同的软件设计模式,它们各自有着不同的目的和应用场景。

  1. 规格模式(Specification Pattern):
  • 定义:规格模式是一种行为设计模式,其目的是将业务规则封装成可重用的对象,并能够动态地组合这些规则,以实现更复杂的业务逻辑。
  • 意图:将一个业务规则表示为一个对象,并且将多个规则组合成更为复杂的规则。该模式可以将规则的表示与规则的实现分离,从而实现可扩展性、可维护性和可重用性。
  • 应用场景:验证对象、从集合中选择符合特定业务规则的对象或对象子集、指定在创建新对象的时候必须要满足某种业务要求。
  1. 策略模式(Strategy Pattern):
  • 定义:策略模式是一种行为设计模式,它提供了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式的目的是使算法的变化独立于使用它们的客户端代码。
  • 意图:策略模式通过将一系列算法封装成独立的策略类,使得算法可以独立于客户端代码进行变化。这种设计模式使得客户端代码可以更加专注于业务逻辑,而不必关心具体的算法实现。
  • 应用场景:避免冗长的 if-else 或 switch 分支判断、提供框架的扩展点、当需要多个功能相似的类并且需要它们之间可以灵活切换时。

区别:

  • 规格模式关注的是业务规则的动态组合和表达,通过将业务规则封装成可重用的对象来实现更复杂的业务逻辑。
  • 策略模式关注的是算法的独立性和变化,通过将一系列算法封装成独立的策略类,使得算法可以独立于客户端代码进行变化。

联系:

  • 两者都属于行为设计模式,旨在通过不同的方式解决业务逻辑或算法的动态性问题。
  • 在某些情况下,规格模式和策略模式可以结合使用。例如,在规格模式中,可以将每个规格视为一个独立的策略类,通过将多个规格组合在一起形成更复杂的业务逻辑。而在策略模式中,也可以使用规格模式来封装不同的算法选择逻辑。

总的来说,规格模式和策略模式虽然有所不同,但在某些情况下它们是可以结合使用的。在选择使用哪种模式时,应根据具体的应用场景和需求来决定。

在这里插入图片描述

代码示例

Java实现规格模式

规格模式在Java中的实现主要涉及到创建规格接口和具体规格类,然后通过组合这些规格类来实现更复杂的业务逻辑。

以下是一个简单的Java实现规格模式的示例:

// 定义规格接口
public interface Specification {boolean isSatisfied();
}// 具体规格类
public class SpecificationA implements Specification {@Overridepublic boolean isSatisfied() {// 具体实现return true;}
}public class SpecificationB implements Specification {@Overridepublic boolean isSatisfied() {// 具体实现return true;}
}// 组合多个规格类
public class CompositeSpecification implements Specification {private List<Specification> specifications = new ArrayList<>();public void add(Specification spec) {specifications.add(spec);}@Overridepublic boolean isSatisfied() {for (Specification spec : specifications) {if (!spec.isSatisfied()) {return false;}}return true;}
}

在上述示例中,我们定义了一个规格接口Specification,然后创建了两个具体规格类SpecificationASpecificationB,它们都实现了Specification接口。我们还创建了一个组合规格类CompositeSpecification,它可以包含多个规格对象,并通过循环检查每个规格对象是否满足条件,来确定整个组合规格是否满足。

通过使用组合规格类,我们可以根据业务需求动态地组合多个规格对象,从而实现更复杂的业务逻辑。例如,我们可以创建一个组合规格对象,然后向其中添加多个具体规格对象,最后通过调用组合规格对象的isSatisfied()方法来判断是否满足所有条件。这种设计模式使得规则的表示与规则的实现分离,提高了系统的可维护性和可重用性。

Python实现规格模式

规格模式在Python中的实现方式与Java类似,主要是通过定义规格接口和具体规格类,然后通过组合这些规格类来实现更复杂的业务逻辑。

以下是一个Python实现规格模式的示例:

# 定义规格接口
class Specification:def is_satisfied(self):pass# 具体规格类
class SpecificationA(Specification):def is_satisfied(self):# 具体实现return Trueclass SpecificationB(Specification):def is_satisfied(self):# 具体实现return True# 组合多个规格类
class CompositeSpecification(Specification):def __init__(self):self.specifications = []def add(self, spec):self.specifications.append(spec)def is_satisfied(self):for spec in self.specifications:if not spec.is_satisfied():return Falsereturn True

在上述示例中,我们定义了一个规格接口Specification,然后创建了两个具体规格类SpecificationASpecificationB,它们都继承了Specification类。我们还创建了一个组合规格类CompositeSpecification,它可以包含多个规格对象,并通过循环检查每个规格对象是否满足条件,来确定整个组合规格是否满足。

通过使用组合规格类,我们可以根据业务需求动态地组合多个规格对象,从而实现更复杂的业务逻辑。例如,我们可以创建一个组合规格对象,然后向其中添加多个具体规格对象,最后通过调用组合规格对象的is_satisfied()方法来判断是否满足所有条件。这种设计模式使得规则的表示与规则的实现分离,提高了系统的可维护性和可重用性。

在这里插入图片描述

规格模式在spring中的应用

规格模式在Spring框架中也有广泛的应用,主要涉及到查询和条件组合等场景。以下是一些具体的例子:

  1. Spring Data JPA的Specification接口:Spring Data JPA提供了一个Specification接口,用于构建查询条件。用户可以通过实现该接口来定义自己的查询条件,然后通过Repository的findAll方法传入Specification对象,即可执行相应条件的查询。
  2. Spring MVC的HandlerMethodArgumentResolver:在Spring MVC中,可以通过实现HandlerMethodArgumentResolver接口来定义请求参数的处理方式。该接口的resolveArgument方法可以用来解析请求参数,并生成相应的对象。在方法参数上使用@RequestParam注解,即可将请求参数绑定到对应的对象属性上。
  3. Spring Security的SecurityExpressionRoot:在Spring Security中,可以使用SecurityExpressionRoot类来构建安全表达式。该类提供了一系列的方法来构建条件表达式,例如hasRole、hasAuthority等。通过将这些表达式组合起来,可以实现复杂的权限控制逻辑。

规格模式在Spring框架中有着广泛的应用,可以帮助用户灵活地构建查询条件、处理请求参数和实现复杂的权限控制逻辑。

在这里插入图片描述

设计模式-策略模式

设计模式-多例模式

设计模式-观察者模式

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

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

相关文章

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型&#xff0c;以学习使用给定风格生成文本&#xff0c;接下来&#xff0c;我们将学习如…

OceanBase原生分布式数据库

1.历史背景 在Java Web项目中&#xff0c;常常使用免费开源的MySQL数据库存储业务数据&#xff0c;按业界经验MySQL单库超过多大数据体量&#xff0c;或单表超过几百万条数据后就会出现查询变慢的情况&#xff0c;单实例数据库只能扩展物理资源(CPU、内存)&#xff0c;来提升查…

vivado 工程管理

管理项目 打开项目 当项目打开时&#xff0c;Vivado IDE会从项目已关闭。项目状态包括当前源文件顺序、已禁用和已启用 源文件、活动约束文件和目标约束文件&#xff0c;以及合成、模拟和实现运行。要打开项目&#xff0c;请使用以下方法之一&#xff1a; •在“入门”页面…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说&#xff0c;在短时间内开发一款高质量设备专用软件&#xff0c;是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台&#xff0c;让客户快速高效的开发自己的设备专…

异构图 神经网络xFraud :Explaniable Fraud transcation detection

适用于异构图 2. 使用图进行异常检测 https://github.com/safe-graph/graph-fraud-detection-papers

Android 通知简介

Android 通知简介 1. 基本通知 图1: 基本通知详情 小图标 : 必须提供,通过 setSmallIcon( ) 进行设置.应用名称 : 由系统提供.时间戳 : 由系统提供,也可隐藏时间.大图标(可选) : 可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过setLargeIcon( ) 进行设置.标题 : 可选…

【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

2024-1-11 文章目录 [2645. 构造有效字符串的最少插入数](https://leetcode.cn/problems/minimum-additions-to-make-valid-string/)方法一&#xff1a;计算组数方法二&#xff1a;动态规划方法三: 考虑相邻字母 2645. 构造有效字符串的最少插入数 方法一&#xff1a;计算组数 …

uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化

文章目录 Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能&#xff0c;uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好&#xff0c;用Recorder插件可避免…

Leetcode 416 分割等和子集

题意理解&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 即将数组的元素分成两组&#xff0c;每组数值sum(nums)/2 若能分成这样的两组&#xff0c;则返回true,否则返回false 本质上…

RobotStudio机器人码垛课程设计

一、任务需求 1、创建动态夹具&#xff08;600*400*50&#xff09; 2、创建物料&#xff08;600*400*200&#xff09; 3、起码按顺序码垛放置 4 个不同位置 二、软件常用操作及其快捷键 &#xff08;推荐自己按这些步骤操作一下&#xff0c;能明白这些操作的具体意义&#…

Java版直播商城:电商源码、小程序、三级分销及 免 费 搭 建 方案

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

[渗透测试学习] Clicker - HackTheBox

文章目录 信息搜集代码审计反弹shell提权 信息搜集 nmap扫描一下端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.232扫描结果 22/tcp open ssh 80/tcp open http Apache httpd 2.4.52 ((Ubuntu)) //重定向 111/tcp open rpcbind 2-4 (RPC #100000)我们往…

如何查看Ubuntu内存的使用情况

在Linux系统中&#xff0c;了解内存使用情况对于系统管理和性能优化非常重要。以下是一些常用的命令&#xff0c;以及它们的详细使用说明&#xff1a; 1. free 命令 用途: free 命令用于显示系统中空闲和已用的物理内存及交换内存。示例: 输入命令: free -m输出解释: 这将以M…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…

重磅消息:2024北京国际智能科技展览会(世亚智博会)官宣定档

在数字新时代的浪潮下&#xff0c;智能科技作为推动社会进步的重要力量&#xff0c;正在以前所未有的速度改变着我们的生活和工作方式。为了进一步推动智能科技的发展和交流&#xff0c;2024北京国际智能科技展览会&#xff08;简称世亚智博会&#xff09;将于2024年6月份在北京…

[C#]winform使用纯opencvsharp部署yolox-onnx模型

【官方框架地址】 https://github.com/Megvii-BaseDetection/YOLOX 【算法介绍】 YOLOX是一个高性能的目标检测算法&#xff0c;它是基于YOLO&#xff08;You Only Look Once&#xff09;系列算法的Anchor Free版本。YOLOX由Megvii Technology的研究团队开发&#xff0c;并在…

在 Windows IIS 生成证书签名请求(CSR)

本操作方法将逐步指导您生成证书签名请求&#xff08;CSR&#xff09;。 这些过程已在Windows 10的IIS 10上进行了测试&#xff0c;但也将在IIS 7.x和8.x中运行。 启动IIS管理器。 Start 开始 IIS管理器。 另外一种快速的方法是打开 运行 命令&#xff0c;然后键入 inetmgr 并…

深度学习算法应用实战 | 利用 CLIP 模型进行“零样本图像分类”

文章目录 1. 零样本图像分类简介1.1 什么是零样本图像分类?1.2 通俗一点的解释 2. 模型原理图3. 环境配置4. 代码实战5. Gradio前端页面5.1 什么是 Gradio ? 6 进阶操作7. 总结 1. 零样本图像分类简介 1.1 什么是零样本图像分类? “零样本图像分类”&#xff08;Zero-shot …

使用懒加载 + 零拷贝后,程序的秒开率提升至99.99%

目录 一、5秒钟加载一个页面的真相二、优化四步走1、“懒加载”2、线上显示 就读取一个文件&#xff0c;为什么会慢呢&#xff1f; 三、先从上帝视角&#xff0c;了解一下啥子是IO流四、写个栗子&#xff0c;测试一下1、通过字符输入流FileReader读取2、通过缓冲流BufferedRea…

Spark---RDD序列化

文章目录 1 什么是序列化2.RDD中的闭包检查3.Kryo 序列化框架 1 什么是序列化 序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区。以后&#xff0c;可以通过从存储区中读取或反序列化对象的…