链式设计及设计模式的应用

链式设计

  1. 定义和概念

    • 链式设计模式是一种行为设计模式,它允许在对象上以链式调用的方式执行多个操作。在这种模式中,对象的方法返回对象本身(this),这样就可以在一个语句中连续调用多个方法,形成类似链条的调用方式。这种模式使得代码更加简洁、可读,并且在构建复杂对象或者执行一系列相关操作时非常有用。例如,在构建SQL查询语句或者配置对象时,链式设计模式可以很好地发挥作用。
  2. 结构和组成部分

    class ChainObject {constructor() {this.value = 0;}add(num) {this.value += num;return this;}multiply(num) {this.value *= num;return this;}
    }
    
    • 对象自身方法返回值:核心特点是对象的方法返回对象本身(this)。例如,在一个简单的链式调用的JavaScript对象中,代码可能如下:
    • 这里的addmultiply方法在执行操作后都返回this,使得可以连续调用这些方法,如new ChainObject().add(2).multiply(3)
    • 链式调用顺序:方法的调用顺序决定了操作的执行顺序。继续上面的例子,先调用add方法将value增加2,然后调用multiply方法将value乘以3。
  3. 优点

    • 代码简洁性:链式调用使得代码更加紧凑和简洁。相比于传统的多次调用对象方法并使用中间变量来保存结果的方式,链式设计模式可以在一行代码中完成多个操作。
      • 例如,在设置HTML元素的样式时,如果使用链式设计模式的JavaScript库(如jQuery的部分功能),可以这样写:$('div').css('color','red').css('font - size','16px');,而不是多次调用css方法并分别保存中间结果。
    • 可读性:当操作具有一定的逻辑顺序时,链式调用可以清晰地展示操作的流程。
      • 以构建一个复杂的URL为例,通过链式设计模式可以这样写:new URLBuilder().setProtocol('https').setDomain('example.com').setPath('/api/data');,从左到右可以很直观地理解是在依次设置URL的协议、域名和路径。
    • 配置的灵活性:在配置对象或者系统参数时,链式设计模式提供了很高的灵活性。可以根据需要选择调用哪些方法来配置对象,而不必一次性传入所有参数。
  4. 缺点

    • 调试复杂性:由于链式调用将多个操作连接在一起,在调试时可能会比较复杂。如果在链式调用中的某个方法出现问题,很难直接定位是哪个具体的调用导致的。
    • 方法链过长可能导致可读性下降:虽然链式设计模式在一定程度上可以提高可读性,但如果方法链过长,代码可能会变得难以理解。
    • 错误处理的复杂性:在链式调用中,如果一个方法出现错误,后续的方法可能无法正常执行,并且很难进行统一的错误处理。
  5. 应用场景

    • 数据库查询构建:在数据库访问层,链式设计模式可以用于构建复杂的查询语句。例如,在一个ORM(对象关系映射)框架中,可以这样构建一个查询:query.select('*').from('users').where('age > ', 18).orderBy('name');,通过链式调用依次选择列、指定表、设置筛选条件和排序规则。
    • 对象配置和初始化:用于配置复杂的对象,如在初始化一个图形绘制对象时,可以这样写:new Graphics().setColor('red').setShape('circle').setSize(100);,方便地设置图形的颜色、形状和大小等参数。
    • DOM操作(在前端开发中):在前端开发中,对HTML元素进行一系列操作时可以使用链式设计模式。例如,使用JavaScript库来操作DOM元素,像document.querySelector('div').style.color ='red'; document.querySelector('div').style.font - size = '16px';可以转换为链式调用document.querySelector('div').setStyle('color','red').setStyle('font - size','16px');(假设存在这样的setStyle方法且返回this),使得操作更加简洁和可读。

设计模式对链式设计应用

建造者模式(Builder Pattern)的变种

- **原理**:传统的建造者模式是将一个复杂对象的构建过程和它的表示分离,使得同样的构建过程可以创建不同的表示。在一些变种中,会采用链式调用的方式来设置对象的各个属性。* 例如,在构建一个复杂的汽车对象时,可能有品牌、颜色、配置等多个属性需要设置,通过链式调用可以这样构建:`CarBuilder builder = new CarBuilder(); Car car = builder.setBrand("Toyota").setColor("Blue").setConfiguration("High - end").build();`。这里的`CarBuilder`类中的`setBrand`、`setColor`等方法返回`this`(即`CarBuilder`对象本身),从而实现链式调用,最后通过`build`方法来生成最终的汽车对象。
- **优点**:这种链式调用方式使得对象的构建过程更加灵活和可读。用户可以根据自己的需求选择性地设置对象的属性,而且代码的顺序性能够清晰地展示对象构建的流程,就像在配置一个产品一样,一步一步地完成复杂对象的定制。

责任链模式(Chain of Responsibility Pattern)

- **原理**:责任链模式是为了处理请求而创建的多个对象组成的链,每个对象都有机会处理请求。在一些实现中,会采用链式设计来构建这个责任链。* 例如,在一个审批系统中,有多个审批环节(如部门主管审批、经理审批、总经理审批),可以通过链式调用将这些审批环节连接起来。每个审批环节对象有一个`setNextHandler`方法,该方法返回自身(`this`),用于连接下一个审批环节,如:
DepartmentHeadApproval departmentHead = new DepartmentHeadApproval();
ManagerApproval manager = new ManagerApproval(); 
departmentHead.setNextHandler(manager).processRequest(request);
    * 这里通过链式调用构建了一个审批链,当一个请求进来时,它会按照链的顺序依次经过各个审批环节,直到有一个环节处理完这个请求或者所有环节都无法处理。
- **优点**:这种链式设计使得责任链的构建更加灵活和直观。可以很方便地添加、删除或者重新排列责任链中的环节,而且在代码中能够清晰地看到各个环节之间的连接关系和顺序。

装饰器模式(Decorator Pattern)的链式装饰实现

- **原理**:装饰器模式是动态地给一个对象添加一些额外的职责。在链式设计的装饰器模式中,装饰器类的方法返回自身(`this`),这样就可以通过链式调用不断地给对象添加装饰。* 例如,在一个咖啡点单系统中,咖啡是基础对象,有牛奶、糖、奶油等装饰选项。可以这样实现链式装饰:`Coffee coffee = new SimpleCoffee(); Coffee decoratedCoffee = coffee.addMilk().addSugar().addCream();`。这里的`addMilk`、`addSugar`、`addCream`等方法是装饰器类的方法,它们返回自身,使得可以不断地对咖啡对象进行装饰,每次装饰都会在原有的基础上添加新的功能或属性。
- **优点**:链式装饰的方式使得对象的功能扩展更加灵活和可组合。可以根据用户的需求灵活地添加或移除装饰,而且代码能够直观地展示出对象经过了哪些装饰和功能扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

git修改某次commit(白痴版)

第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…

AI 建站:Durable

网址:https://app.durable.co 步骤 1) 登录 2)点击创建新业务 3)填写信息后,点击创建 4)进入业务 5)生成网站 6)生成完成后不满意的话可以自己调整 7)点击保存 8)发布 …

网络原理之 TCP 协议

目录 1. TCP 协议格式 2. TCP 原理 (1) 确认应答 (2) 超时重传 (3) 连接管理 a) 三次握手 b) 四次挥手 (4) 滑动窗口 (5) 流量控制 (6) 拥塞控制 (7) 延时应答 (8) 捎带应答 3. TCP 特性 4. 异常情况的处理 1) 进程崩溃 2) 主机关机 (正常流程) 3) 主机掉电 (…

Python爬虫之selenium库驱动浏览器

目录 一、简介 二、使用selenium库前的准备 1、了解selenium库驱动浏览器的原理 (1)、WebDriver 协议 (2)、 浏览器驱动(Browser Driver) (3)、 Selenium 客户端库 &#xff0…

Vite+Vue3项目实战:组件化开发与通信指南

一、典型的ViteVue3项目结构 续上文成功创建Vue3项目的脚手架,通过visual Studio Code软件打开刚刚创建的文件夹,将会看到这样一个项目结构。 使用Vite构建Vue3项目时,项目结构通常遵循一定的组织规则,以保持代码的清晰和可维护性…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车,搭载N62B48B发动机,累计行驶里程约为26万km。车主反映,发动机偶尔无法起动,故障频率较低,十几天出现1 次,且故障出现时起动机不工作。 故障诊断  接车后试车,…

团队管理中如何做好目标管理

团队管理中的目标管理是确保团队高效运行的核心要素之一。 在目标管理中,清晰的目标设定、合理的资源分配、实时的跟踪与反馈机制是成功的关键。首先,设定SMART目标(具体、可衡量、可达成、相关性强、时间限定)能够有效聚焦团队的…

【力扣热题100】—— Day4.反转链表

你不会永远顺遂,更不会一直年轻,你太安静了,是时候出发了 —— 24.12.2 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出&…

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode?二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…

记事本建java及java命名规范

1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…

过程管理系统(源码+文档+部署+讲解)

本文将深入解析“过程管理系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 过程管理系统是一款专为工业设计的综合管理平台,旨在通过集成各种管理流程和功能模块来提高管理效率和安全性。系统提供了从登录系…

期权懂|个股期权交割操作流程是什么样的?

期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权交割操作流程是什么样的? 一、行权申报: 期权买方在行权日通过其经纪商提交行权指令,表明其决定行使期权权利。 二、行权匹配&#xf…

智能仓储:入库业务流程介绍

01 入库流程 入库业务流程,常见过程是这样的: 创建PO单 > 创建到货清单 > 核对货物 > 入库质检 > 货物贴标签 > 上架 > 库存同步 1、创建PO单 po单指的是的采购订单,比如采购了一车货品,这车的货品可以理解…

MySQL并发控制(一):幻读

假设有如下表结构: CREATE TABLE t(id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25); 问:如果执行…

Ubuntu22.04中mysql8 rpm安装

1、安装依赖 sudo apt update sudo apt -y dist-upgrade sudo apt -y install vim net-tools wget gcc make cmake lrzsz sudo apt -y install libmecab2 libjson-perl 2、下载rpm文件 https://dev.mysql.com/downloads/mysql/ https://cdn.mysql.com//Downloads/MySQL-8.0/m…

Intel 性能分析“全家桶” For HPC(一)

本系列是对于HPC应用性能分析涉及的主要方法论及Intel主流工具分享。理解这些方法论将有助于对性能分析结果的理解。同时方法论也可以推广到其他的硬件平台的分析上。除此之外后面也将介绍如何用Vtune, Advisor以及ITAC进行性能分析,以及在性能分析过程中这三种性能…

Qwen1.8B大模型微调流程

提示:本篇笔记是在微调大模型为法律相关模型的教程下记录的,参考的讲解视频在B站上,一搜微调大模型为法律大模型就有很多视频。 文章目录 1. 数据集1.1 数据下载1.2 数据格式转换 2. 模型训练2.1 安装依赖2.2 模型训练 3. 模型推理3.1 LoRA模…

第十六章 使用 iSCSI 服务部署网络存储

1. iSCSI 技术介绍 硬盘是计算机硬件设备中重要的组成部分之一,硬盘存储设备读写速度的快慢也会对服务器的整体性能造成影响。硬盘存储结构、RAID 磁盘阵列技术以及LVM 技术等都是用于存储设备的技术,尽管这些技术有软件层面和硬件层面之分&#xff0c…

【js面试题】JavaScript 中箭头函数与普通函数的深度剖析

在 JavaScript 编程的世界里,函数是极为重要的组成部分。而随着 ES6 的出现,箭头函数成为了 JavaScript 函数家族中的新成员。它与传统的普通函数有着诸多的不同之处,这些差异深刻地影响着我们编写代码的方式以及代码的执行逻辑。本文将对 Ja…

【漫话机器学习系列】Adaboost算法

Adaboost(Adaptive Boosting)是一种经典的集成学习方法,主要思想是通过将多个弱学习器(通常是简单模型,如决策树桩)加权组合,来提升整体模型的预测能力。Adaboost 是一种自适应的学习方法&#…