设计模式-规格模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 规格模式和策略模式的区别和联系
    • 代码示例
      • 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 {
    @Override
    public boolean isSatisfied() {
        // 具体实现
        return true;
    }
}

public class SpecificationB implements Specification {
    @Override
    public boolean isSatisfied() {
        // 具体实现
        return true;
    }
}

// 组合多个规格类
public class CompositeSpecification implements Specification {
    private List<Specification> specifications = new ArrayList<>();

    public void add(Specification spec) {
        specifications.add(spec);
    }

    @Override
    public 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 True

class 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 False
        return 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框架中有着广泛的应用,可以帮助用户灵活地构建查询条件、处理请求参数和实现复杂的权限控制逻辑。

在这里插入图片描述

设计模式-策略模式

设计模式-多例模式

设计模式-观察者模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[后端] 微服务的前世今生

微服务的前世今生 整体脉络: 单体 -> 垂直划分 -> SOA -> micro service 微服务 -> services mesh服务网格 -> future 文章目录 微服务的前世今生单一应用架构特征优点&#xff1a;缺点&#xff1a; 垂直应用架构特征优点缺点 SOA 面向服务架构特征优点缺点 微服…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷④

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 模块一 …

Every Nobody Is Somebody 「每小人物都能成大事」

周星驰 NFT Nobody即将发售&#xff0c;Nobody共创平台 Every Nobody Is Somebody Nobody 关于Nobody&#xff1a;Nobody是一款Web3共创平台&#xff0c;旨在为创作者提供一个交流和合作的场所&#xff0c;促进创意的产生和共享。通过该平台&#xff0c;创作者可以展示自己的作…

在群晖NAS上搭建私有部署笔记软件——Blossom

一、Blossom 简介 Blossom 是一个需要私有部署的笔记软件&#xff0c;虽然本身定位是一个云端软件&#xff0c;但你仍然可以在本地部署&#xff0c;数据和图片都将保存在本地&#xff0c;不依赖任何的图床或者对象存储。 Blossom | Blossom (wangyunf.com)https://www.wangyun…

【教学类-45-01】X-Y之间的“三连加“题(a+b+c=)

作品展示&#xff1a; 背景需求&#xff1a; 我常去的大4班孩子们基本都适应了0-5之间的加法题&#xff0c;做题速度极快。 为了增加“花样”&#xff0c;吸引幼儿参与&#xff0c;修改参数&#xff0c;从二连加12变为三连加111。 素材准备: 代码重点 代码展示 X-Y 之间的3…

备战2024美赛数学建模,文末获取历史优秀论文

总说&#xff08;历年美赛优秀论文可获取&#xff09; 数模的题型千变万化&#xff0c;我今天想讲的主要是一些「画图」、「建模」、「写作」和「论文结构」的思路&#xff0c;这些往往是美赛阅卷官最看重的点&#xff0c;突破了这些点&#xff0c;才能真正让你的美赛论文更上…

计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候&#xff0c;想要复现别人的成果&#xff0c;但是别人的代码都是每帧输出 ply 格式的文件&#xff0c;渲染部分需要自己完成 看了一下&#xff0c;似乎用 blender 是最简单的&#xff0c;于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…

Federated Unlearning for On-Device Recommendation

WSDM 2023 CCF-B Federated Unlearning for On-Device Recommendation 本文工作的主要介绍 本文主要介绍了一种名为FRU&#xff08;Federated Recommendation Unlearning&#xff09;的联邦学习框架&#xff0c;用于在设备端的推荐系统中实现用户数据的有效擦除和模型重建。…

专业课128分总分400+南京理工大学818信号系统与数字电路南理工考研经验分享

专业课128分总分400南京理工大学818信号系统与数字电路南理工电光院考研经验分享&#xff0c;希望自己的经历对大家有借鉴。 我是在六月底确认自己保不上研然后专心备考的&#xff0c;时间确实比较紧张。虽然之前暑假看了一点高数&#xff0c;但因为抱有保研的期望&#xff0c…

JMeter之Windows安装

JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…

探索浏览器的内心世界:渲染机制的奥秘

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

im6ull学习总结(三-4)freetype显示单个字体

矢量字体引入 使用点阵字库显示英文字母、汉字时&#xff0c;大小固定&#xff0c;如果放大缩小则会模糊甚至有锯齿出现&#xff0c;为了解决这个问题&#xff0c;引用矢量字体。 矢量字体形成分三步&#xff1a; 第1步 确定关键点&#xff0c; 第2步 使用数学曲线&#xff08…

软件测试|Windows系统配置pytest+allure环境教程

前言 allure可以输出非常精美的测试报告&#xff0c;也可以和pytest进行完美结合&#xff0c;不仅可以渲染页面&#xff0c;还可以控制用例的执行。本文我们将介绍Windows系统中如何配置allure环境。 第一步&#xff1a;配置Java环境 因为allure的运行依赖于Java环境&#x…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中&#xff0c;有些数据需要远程调用&#xff0c;导致查询时间缓慢&#xff0c;影响以下代码逻辑运行&#xff0c;并且这些浪费时间的逻辑与以后的请求并没有关系&#xff0c;这样会大大增加服务的时间。 假如商品详情页的每个查询&#xff0c;需要如下…

2024年3月10日PMI认证考试的报名时间确定!

⏰中国大陆地区2024年第1期PMI认证考试于3月10日举办 ⏰报名时间&#xff1a; 为减少同一时间集中报名造成的网络拥堵&#xff0c;本次报名将采取以下形式分地区、分批次开放报名。&#x1f447; 1️⃣第1批报名城市&#xff1a;⏰2024年1月11日10:00至1月18日16:00&#xff0c…

【AI之路】使用huggingface_hub通过huggingface镜像站hf-mirror.com下载大模型(附代码,实现大模型自由)

文章目录 前言一、Hugging face是什么&#xff1f;二、huggingface镜像站hf-mirror.com三、大模型一键下载1. 准备工作2. 下载代码 总结后记 前言 要玩AI大模型&#xff0c;Hugging face 不可错过&#xff0c;但资源虽不错&#xff0c;可奈何国内下载速度很慢&#xff0c;动则…

优雅处理并发:Java CompletableFuture最佳实践

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天&#xff0c;小黑要和大家聊聊CompletableFuture&#xff0c;这个Java 8引入的强大工具。 在Java传统的Future模式里&#xff0c;咱们都知道&#xff0c;一旦开始了一个异步操作&#xff0c;就只能等它结束…

整形数据在内存中的存储(C语言)

整形数据在内存中的存储 1.整形家族2.(原码、反码、补码)基础知识3.大小端3.1 什么是大小端3.2 为什么有大端和小端3.3 一道关于大小端字节序的面试题3.4 关于整形数据存储的题目(7题)3.4.13.4.23.4.33.4.43.4.53.4.63.4.7 4.总结 1.整形家族 signed可省可不省&#xff0c;一般…

尝试OmniverseFarm的最基础操作

目标 尝试OmniverseFarm的最基础操作。本地机器作为Queue和Agent&#xff0c;同时在本地提交任务。 主要参考了官方文档&#xff1a; Farm Queue — Omniverse Farm latest documentation Farm Agent — Omniverse Farm latest documentation Farm Examples — Omniverse Far…

蜗牛目标检测数据集VOC格式480张

蜗牛&#xff0c;一种缓慢而坚韧的软体动物&#xff0c;以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形&#xff0c;有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异&#xff0c;有的光滑如玻璃&#xff0c;有的则布满细纹。蜗牛的头部有两对触角…