当前位置: 首页 > news >正文

设计模式-流接口模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 流接口模式和工厂模式的区别
    • 代码示例
      • Java实现流接口模式
      • Python实现流接口模式
    • 流接口模式在spring中的应用


模式介绍

流接口模式是一种面向对象的编程模式,它可以使代码更具可读性和流畅性。流接口模式的核心思想是采用链式调用的方式来实现一系列对象方法的调用,每个方法调用都返回一个对象,从而可以继续调用下一个方法。这种模式类似于自然语言的句子结构,使得代码更易于理解和维护。

在流接口模式中,每个方法都返回一个对象,通常是通过在方法签名中加入"this"关键字来实现。这样,每个方法都可以被视为在返回对象上执行的操作,从而形成了一个方法调用的链。

流接口模式的好处在于它可以使代码更加简洁和易读。由于方法调用被组织成了一个链,因此在编写代码时可以更方便地表达逻辑关系。此外,流接口模式还可以提高代码的可维护性,因为每个方法都专注于执行一项特定的任务,并且可以被单独修改和测试。

流接口模式的应用非常广泛,许多框架和库都采用了这种模式。例如,PHPUnit 使用流接口模式来创建 mock 对象,Yii 框架中的 CDbCommand 和 CActiveRecord 类也使用了流接口模式。这种模式也被广泛应用于数据库操作、JSON 序列化和解析等场景中。

流接口模式是一种非常实用的编程模式,它可以提高代码的可读性和可维护性。通过链式调用和"this"关键字的巧妙运用,可以轻松地实现一系列对象方法的调用,从而简化复杂逻辑的表达。

在这里插入图片描述

模式特点

流接口模式的优点主要包括:

  1. 可读性高:流接口模式通过链式调用,使得代码更加流畅和易读,符合自然语言的阅读习惯。
  2. 灵活性强:可以很方便地对对象进行一系列的操作,而无需在每个操作之后重新获取对象。此外,流接口模式允许在运行时动态地添加或删除操作。
  3. 代码简洁:通过减少中间变量的使用,流接口模式可以使得代码更加简洁。

然而,流接口模式也存在一些缺点:

  1. 调试困难:由于链式调用的特性,当链中的某个方法出现问题时,定位问题可能会比较困难。因为错误可能发生在链中的任何一个环节,需要逐一排查。
  2. 性能问题:在某些情况下,流接口模式可能会导致性能下降。例如,当链中的方法执行了大量的操作时,由于每个方法都返回一个新的对象,可能会增加额外的内存开销和垃圾回收的负担。
  3. 类型安全:在静态类型语言中,流接口模式可能会破坏类型安全。因为链式调用的结果通常是一个新的对象,而这个对象的类型可能与原始对象的类型不同。这可能导致在编译时无法检测到类型错误,从而在运行时引发异常。

流接口模式在提高代码可读性和灵活性的同时,也带来了一些调试、性能和类型安全方面的挑战。因此,在使用流接口模式时需要权衡这些优缺点,并根据具体的场景和需求做出决策。

在这里插入图片描述

应用场景

流接口模式的应用场景主要包括以下几个方面:

  1. 数据库操作:在许多数据库操作中,可以使用流接口模式来构建查询语句。通过链式调用,可以方便地添加筛选条件、排序规则等,从而构建出完整的查询语句。
  2. JSON序列化和解析:在处理JSON数据时,流接口模式可以方便地构建JSON对象或解析JSON字符串。通过链式调用,可以设置不同的选项或格式,以满足特定的需求。
  3. 测试框架:测试框架中也可以使用流接口模式来创建模拟对象或设置断言。通过链式调用,可以方便地设置期望值和断言条件,从而简化测试代码的编写。
  4. 命令行工具:在命令行工具中,流接口模式可以方便地构建命令行选项和参数。通过链式调用,可以设置不同的参数和选项,以实现复杂的命令行功能。

流接口模式适用于需要构建复杂对象或操作序列的场景,特别是那些需要提高代码可读性和灵活性的场景。通过链式调用的方式,可以方便地组织和表达一系列的操作,使得代码更加简洁、易读和维护。

在这里插入图片描述

流接口模式和工厂模式的区别

流接口模式和工厂模式是两种不同的编程模式,它们的目标和应用场景有所不同。

流接口模式的核心思想是通过链式调用的方式实现一系列对象方法的调用,旨在提高代码的可读性和编写流畅性。该模式通常用于简化代码的编写过程,将一系列操作连接在一起形成一个连贯的操作序列。流接口模式主要关注的是操作序列的流畅性和可读性,通过链式调用来实现操作序列的组合和调用。

而工厂模式是一种创建型设计模式,用于创建对象并隐藏对象的创建逻辑。通过使用工厂模式,可以将对象的创建和使用分离,降低代码的耦合度,并提高代码的可扩展性和可维护性。工厂模式主要关注的是对象的创建和管理,通过提供一个共同的接口来指向新创建的对象,使得调用者无需关心具体的实现细节。

虽然流接口模式和工厂模式有所不同,但它们在实际应用中可以相互结合使用。例如,在实现工厂模式时,可以使用流接口模式来配置参数或设置对象的属性。或者在实现流接口模式时,可以使用工厂模式来创建对象并管理对象的生命周期。这种结合使用的方式可以充分发挥两种模式的优势,提高代码的可读性、可维护性和可扩展性。

流接口模式和工厂模式是两种不同的编程模式,它们的目标和应用场景有所不同。在实际应用中,可以根据具体的需求和场景选择适合的模式,或者将两种模式结合使用,以获得更好的编程效果。

在这里插入图片描述

代码示例

Java实现流接口模式

在Java中,流接口模式通常通过实现java.util.function包中的函数式接口来实现。以下是一个简单的示例,演示如何使用流接口模式来计算一个整数列表的平方和:

import java.util.List;
import java.util.function.IntBinaryOperator;public class StreamInterfaceExample {public static void main(String[] args) {List<Integer> numbers = List.of(1, 2, 3, 4, 5);int sum = numbers.stream().reduce(0, (n, acc) -> acc + n, (a, b) -> a + b);System.out.println("Sum of squares: " + sum);}
}

在上面的示例中,我们使用了java.util.stream.Stream接口的reduce方法来计算整数列表的平方和。reduce方法接受三个参数:一个初始值、一个二元操作符和一个累加器。在示例中,初始值为0,二元操作符是累加操作,累加器是将两个整数相加。通过链式调用,我们实现了流接口模式,并将结果打印到控制台。

除了reduce方法外,Java中的流接口还提供了许多其他方法,如mapfiltercollect等,可以用于对流中的元素进行各种操作。这些方法都返回一个新的流对象,可以继续调用其他方法,从而实现流接口模式。

Python实现流接口模式

在Python中,流接口模式通常通过生成器、装饰器和上下文管理器来实现。以下是一个简单的示例,演示如何使用生成器实现流接口模式:

def square_stream(n):def square(x):return x ** 2for i in range(n):yield square(i)# 使用生成器计算1到5的平方
for square in square_stream(5):print(square)

在上面的示例中,我们定义了一个名为square_stream的生成器函数,它接受一个参数n,并使用嵌套的生成器函数square来计算从0到n-1的平方。在主程序中,我们使用for循环来迭代生成器,并打印每个平方的值。通过这种方式,我们实现了流接口模式,并能够方便地计算一系列数字的平方。

除了生成器外,Python还提供了装饰器和上下文管理器等其他工具,可以用于实现流接口模式。这些工具可以帮助我们将复杂的逻辑封装在一个函数或类中,并通过简单的接口来使用它们。

在这里插入图片描述

流接口模式在spring中的应用

在Spring框架中,流接口模式主要应用于处理资源。Spring的Resource接口提供了几个方法,如getInputStream()exists()isOpen()getDescription()getFile()getURL()。这些方法使得资源处理更加灵活和方便。

例如,getInputStream()方法用于定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流,调用者必须负责关闭输入流。这样可以实现链式调用,方便地获取和操作资源。

此外,Spring还提供了UrlResource类作为Resource接口的实现类,用于访问网络资源。通过使用UrlResource类,可以方便地获取网络资源的输入流,并进行进一步的处理。

Spring通过流接口模式为资源处理提供了灵活和方便的解决方案,使得开发者能够更加高效地处理各种资源。

在这里插入图片描述

设计模式-工厂模式

设计模式-过滤器模式

设计模式-门面模式

相关文章:

设计模式-流接口模式

设计模式专栏 模式介绍模式特点应用场景流接口模式和工厂模式的区别代码示例Java实现流接口模式Python实现流接口模式 流接口模式在spring中的应用 模式介绍 流接口模式是一种面向对象的编程模式&#xff0c;它可以使代码更具可读性和流畅性。流接口模式的核心思想是采用链式调…...

Java 堆与栈的作用与区别

栈是运行时的单位&#xff0c;而堆是存储的单位&#xff0c;栈解决程序的运行问题&#xff0c;堆解决数据存储的问题。 一个线程对应一个线程栈&#xff0c;栈是运行单位&#xff0c;里面存储的信息都是跟当前线程相关的信息&#xff0c;包括局部变量、程序运行状态、方法返回…...

再谈小米汽车

文章目录 1. 外观2. 电机3. 电池4. 风阻5. 强度6. 智能驾驶 我在两年前分析过小米造车的形势&#xff0c;大家可以 点击这里查看。今天小米官宣传了新汽车。看一下它公布的主要信息&#xff1a; 1. 外观 汽车外观是向保时捷致敬&#xff0c;因此它的外观特别像保时捷。不过外…...

Power Apps 学习笔记 - IOrganizationService Interface

文章目录 1. IOrganization Interface1.1 基本介绍1.2 方法分析 2. Entity对象2.1 Constructor2.2 Properties2.3 Methods 3. 相关方法3.1 单行查询 Retrive3.2 多行查询 RetriveMultiple3.3 增加 Create3.4 删除 Delete3.5 修改 Update 4. 数据查询的不同实现方式4.1 QueryExp…...

常见函数的4种类型(js的问题)

• 匿名函数 • 回调函数 • 递归函数 • 构造函数 1、匿名函数 定义时候没有任何变量引用的函数 匿名函数自调&#xff1a;函数只执行一次 (function(a, b){console.log(a b);} )(1, 2);// 等价于 function foo (a, b){console.log(a b); }foo(1, …...

DNS主从服务器、转发(缓存)服务器

一、主从服务器 1、基本含义 DNS辅助服务器是一种容错设计&#xff0c;考虑的是一旦DNS主服务器出现故障或因负载太重无法及时响应客户机请求&#xff0c;辅助服务器将挺身而出为主服务器排忧解难。辅助服务器的区域数据都是从主服务器复制而来&#xff0c;因此辅助服务器的数…...

第二十一章 网络编程

第二十一章 网络编程 1.网络相关概念2.IP地址3.域名与端口4.网络协议5.TCP与UDP6.InetAddress7.Socket8.TCP字节流编程19.TCP字节流编程210.TCP字节流编程311.网络上传文件112.网络上传文件213.网络上传文件314.Netstat15.TCP连接秘密16.UPD原理17.UPD网络编程118.UDP网络编程2…...

scratch新跳7游戏 2023年12月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch新跳7游戏 一、题目要求 1、准备工作 2、功能实现 二、案例分析...

三、C#面向对象编程(接口与实现)

在C#中&#xff0c;接口是一种定义方法但不包含实现的方式&#xff0c;可以被多个类实现以支持不同的行为。通过接口&#xff0c;我们可以定义一组标准的成员&#xff0c;让类遵循特定的契约。 下面是一个关于接口和实现的简单示例&#xff1a; // 定义一个接口 public inter…...

【java爬虫】股票数据获取工具前后端代码

前面我们有好多文章都是在介绍股票数据获取工具&#xff0c;这是一个前后端分离项目 后端技术栈&#xff1a;springboot&#xff0c;sqlite&#xff0c;jdbcTemplate&#xff0c;okhttp 前端技术栈&#xff1a;vue&#xff0c;element-plus&#xff0c;echarts&#xff0c;ax…...

Scikit-Learn线性回归(四)

Scikit-Learn线性回归四:梯度下降 1、梯度下降1.1、梯度下降概述1.2、梯度下降及原理1.3、梯度下降的实现2、梯度下降法求解线性回归的最优解2.1、梯度下降法求解的原理2.2、梯度下降法求解线性回归的最优解2.3、梯度下降法求解线性回归案例(波士顿房价预测)3、Scikit-Learn…...

SCT2330C——3.8V-28V输入,3A,低EMI,超低功耗同步降压DCDC转换器

描述&#xff1a; SCT2330C是3A同步buck变换器&#xff0c;输入电压范围高达28V&#xff0c;完全集成了80mΩ高压侧MOSFET和42mΩ低压侧MOSFET&#xff0c;提供高效降压DC-DC转换。SCT2330C采用峰值电流模式控制&#xff0c;集成补偿网络&#xff0c;通过最小化片外元件数量&a…...

php生成唯一ID的5种方法介绍

php生成唯一ID的5种方法介绍 工作中使用到唯一ID的场景非常多&#xff0c;如临时缓存文件、临时变量、临时安全码等。 uniqid()函数基于以微妙计的当前时间&#xff0c;生成一个唯一的ID。由于生成唯一ID与微妙时间关联&#xff0c;因此生成ID的唯一性非常可靠。 生成的唯一…...

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…...

Unity 欧盟UMP用户隐私协议Android接入指南

Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d882171b068c46a1b956e80425f3a9cf.png)测…...

AutoLisp入门教程

AutoLisp入门教程 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在编程的世界里&#xff0c;有许多领域和语言需要我们去探索&#xff0c;今天我们将聚焦于 AutoLI…...

matplotlib颜色合集——各种常见简单图形(上)

一、.颜色配图表 图文颜色引用&#xff1a;建站教程 - FINTHON 二、折线图 jupyter notebook 简介plot() 2.1折线图参数 plt.plot(*args, scalexTrue, scaleyTrue, dataNone, **kwargs) 2.2、参数介绍 x&#xff1a;X轴数据&#xff0c;列表或数组&#xff0c;可选。 y&a…...

小H靶场笔记:DC-3

DC-3 January 3, 2024 4:11 PM Tags&#xff1a;Joomla owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff1a; 192.168.199.133 nmap 扫描端口、 系统版本 漏洞 发现只有80端口开发&#xff0c; 且有cve-2017-8917漏洞存在是Joomla的SQL注入漏洞 Joomla版本为3.7.0…...

Web网页开发-CSS高级技巧2-笔记

1.已知宽高垂直水平居中 定位负margin法&#xff1a; 利用top:50%;left:50%;margin-left:子盒子宽度的一半;margin-top:子盒子高度的一半; 2.不定宽高垂直水平居中 兼容性最好的方案&#xff1a; 用定位margin:auto&#xff0c;定位 四个方向的值相等margin&#xff1a;auto…...

C++面向对象语法总结(二)

目录 《C基础语法总结》《C面向对象语法总结(一&#xff09;》 十一、继承 继承&#xff0c;可以让子类拥有父类的多有成员&#xff08;变量、函数&#xff09;如下面的代码&#xff1a;Student是子类&#xff08;subclass,派生类&#xff09;&#xff0c;Person是父类&…...

【LeetCode每日一题】2487. 从链表中移除节点(调用栈+递归+翻转链表)

2024-1-3 文章目录 [2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)方法一&#xff1a;调用栈方法二&#xff1a;递归方法三&#xff1a;翻转链表 2487. 从链表中移除节点 方法一&#xff1a;调用栈 1.将所有节点按顺序压入栈中 2.从…...

开源协助平台工程灵活应对多云时代的挑战

平台工程通过标准化控制和灵活性保障了开发实践。但是&#xff0c;随着平台工程的兴起&#xff0c;开源战略又该如何融入其中呢&#xff1f; 虽然平台工程没有一刀切的方法&#xff0c;但越来越明显的是&#xff0c;开源软件和技术对平台工程的成功绝对至关重要——这一点我将在…...

Springboot通过profiles切换不同环境使用的配置

文章目录 简介1.通过分隔符隔离2.通过使用不同的配置文件区分3.测试 简介 一个项目从开发到上线一般要经过几个环境, dev测试环境-uat预生产环境-prod生产环境&#xff0c;每个环境的使用的数据库或者配置不同&#xff0c;这时候可以通过下面两种方式区分配置,达到快速切换的效…...

SpringBoot入门到精通-Spring Boot Jasypt Encrypt 演示

这是 spring boot 应用程序,展示了如何使用 Jasypt 加密值。 关于Jasypt Jasypt 为您提供简单的单向(摘要)和双向加密技术。开放 API,可与任何 JCE 提供程序一起使用,而不仅仅是默认的 Java VM 提供程序。Jasypt 可以很容易地与 Bouncy Castle 等知名提供商一起使用。了解…...

整数的阶乘(英语:factorial)是所有小于及等于

整数的阶乘&#xff08;英语&#xff1a;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;0的阶乘为1。即&#xff1a;n!123...n。 实例 #!/usr/bin/python3 # Filename : test.py # author by : www.dida100.com # 通过用户输入数字计算阶乘 # 获…...

音视频通信

文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节&#xff1a;采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节&#xff0c;还有更细分的技术模块。比如&#xff0c;前后处…...

docker 搭建gitlab 恢复和备份

最近一直在折腾gitlab 代码管理系统 采用docker搭建 镜像网址 https://hub.docker.com/ 技术交流 http://idea.coderyj.com/ 1.因为我要恢复的版本是12.0.9的所有我就下载了docker-ce的12.0.9的镜像 1.下载镜像 docker pull gitlab/gitlab-ce:12.0.9-ce.02.安装 docker run …...

尚硅谷2023版Promise教程从入门到实战(讲师:任安萍)

一、前言&#xff1a;为什么会出现Promise? Promise的重要性我认为没有必要多讲&#xff0c;概括起来说就是五个字&#xff1a;必&#xff01;须&#xff01;得&#xff01;掌&#xff01;握&#xff01;。 而且还要掌握透彻&#xff0c;在实际的使用中&#xff0c;有非常多…...

【SpringBoot】分组校验和自定义校验

分组检验 参数校验时&#xff0c;我们希望不同的方法参数校验规则不同&#xff0c;这时就需要分组校验。 public class Category {NotNull(groups Update.class)private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称// NotEmpty(groups {Add.class,…...

19、BLIP-2

简介 github 通过利用预训练的视觉模型和语言模型来提升多模态效果和降低训练成本&#xff0c;预训练的视觉模型能够提供高质量的视觉表征&#xff0c;预训练的语言模型则提供了强大的语言生成能力。 实现过程 为了弥合模态差距&#xff0c;提出了一个分两个阶段预训练的 Qu…...

石家庄市建设局质监站网站/网络站点推广的方法有哪些

前言 在SpringBoot中使用自定义注解、aop切面打印web请求日志。主要是想把controller的每个request请求日志收集起来&#xff0c;调用接口、执行时间、返回值这几个重要的信息存储到数据库里&#xff0c;然后可以使用火焰图统计接口调用时长&#xff0c;平均响应时长&am…...

wordpress超人采集侠/百度seo优化是什么

Easter[i:stə] Eastern. 复活节 例句与用法&#xff1a;1.Christmas and Easter are Christian festivals. 圣诞节和复活节是基督教的节日。2.Easter falls early this year. 今年的复活节来得早。3.Easter comes early this year. 今年复活节来得早。4.Five thousand peo…...

嘉定企业网站制作/12345浏览器网址大全

为什么80%的码农都做不了架构师&#xff1f;>>> <script type"text/javascript">var whenReady (function () { //这个函数返回whenReady&#xff08;&#xff09;函数var funcs []; //当获得事件时&#xff0c;要运行的函数var…...

wordpress qq邮箱 smtp/网站数据分析

据官方消息&#xff0c;华为鸿蒙手机操作系统将于6月2日正式发布。同时&#xff0c;还有很多产品会安装鸿蒙操作系统。比如华为最新的智能手表&#xff0c;华为MatePadPro&#xff0c;等等。事实上&#xff0c;对于业界和消费者来说&#xff0c;最关心的还是初始型号商名单。按…...

给女朋友做网站的素材/seo基础篇

一、Scrapy简介 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架。 其可以应用在数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的&#xff0c; 也可以应用在获取API所返回的数据…...

独立网站建设步骤/网站维护一年一般多少钱?

1.增加utf8mb4的支持 SHOW VARIABLES WHERE Variable_name LIKE character% OR Variable_name LIKE collation%; 2.xtrabackup 因为测试环境都是5.7&#xff0c;所以需要升级。 具体步骤 mysql5.7 shell自动安装脚本 2.xtarbackup备份测试库&#xff0c;还原到现在的新安装的库…...