职责链模式

如何在VSCode中无缝集成Azure OpenAI GPT-5-codex?保姆级配置教程 本文详细介绍了在VSCode中无缝集成Azure OpenAI GPT-5-codex的完整配置教程,涵盖环境准备、Azure资源创建、本地配置、VSCode插件安装及高级定制。通过Codex CLI和config.toml文件配置,开发者可快速实现AI辅助编程,大幅提升代码生成、错误诊断和文档编写效率。 阅读详情

职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

假设我们负责一个售卖手机的电商网站,经过分别交纳 500 元定金和 200 元定金的两轮预定 后(订单已在此时生成),现在已经到了正式购买的阶段。

公司针对支付过定金的用户有一定的优惠政策。在正式购买后,已经支付过 500 元定金的用 户会收到 100 元的商城优惠券,200 元定金的用户可以收到 50 元的优惠券,而之前没有支付定金的用户只能进入普通购买模式,也就是没有优惠券,且在库存有限的情况下不一定保证能买到。

将这个流程变成代码如下所示:

// orderType 表示订单类型
// 值为1时表示500元定金用户,值为2时表示200元定金用户,值为3时表示普通用户
// pay表示用户是否支付定金,true表示已经支付,false表示没有支付
// stock表示当前用于普通购买的手机库存数量,已经支付过500元或者200元定金的用户不受此限制
var order = function(orderType, pay, stock) {
    if (orderType === 1) {
        if (pay === true) {
            console.log('500元定金预购,得到100优惠券');
        } else {
            if (stock > 0) {
                console.log('普通购买,无优惠券');
            } else {
                console.log('手机库存不足');
            }
        }
    } else if (orderType === 2) {
        if (pay === true) {
            console.log('200元定金预购,得到50优惠券');
        } else {
            if (stock > 0) {
                console.log('普通购买,无优惠券');
            } else {
                console.log('手机库存不足');
            }
        }
    } else if (orderType === 3) {
        if (stock > 0) {
            console.log('普通购买,无优惠券');
        } else {
            console.log('手机库存不足');
        }
    }
}

但是这段代码过于巨大,难以修改,不利于维护。使用职责链可以将这个函数拆分成500元定金函数,200元定金函数,普通用户函数,接下来把 orderType、pay、stock 这 3 个字段当作参数传递给 500 元订单函数,如果该函数不 符合处理条件,则把这个请求传递给后面的 200 元订单函数,如果 200 元订单函数依然不能处理 该请求,则继续传递请求给普通购买函数,代码如下:

var order500 = function( orderType, pay, stock ) {
    if (orderType === 1 && pay === true){ 
        console.log( '500 元定金预购,得到 100 优惠券' ); 
    } else { 
        return 'nextSuccessor'; // 我不知道下一个节点是谁,反正把请求往后面传递
    } 
}; 

var order200 = function( orderType, pay, stock ) {
    if (orderType === 2 && pay === true) { 
        console.log( '200 元定金预购,得到 50 优惠券' ); 
    } else { 
        return 'nextSuccessor'; // 我不知道下一个节点是谁,反正把请求往后面传递 
    } 
}; 

var orderNormal = function( orderType, pay, stock ) { 
    if (stock > 0) {
        console.log( '普通购买,无优惠券' ); 
    } else { 
        console.log( '手机库存不足' ); 
    } 
};

接下来需要把函数包装进职责链节点,我们定义一个构造函数 Chain,在 new Chain 的时候传 递的参数即为需要被包装的函数,同时它还拥有一个实例属性 this.successor,表示在链中的下 一个节点。

// Chain.prototype.setNextSuccessor 指定在链中的下一个节点
// Chain.prototype.passRequset 传递请求给某个节点

var Chain = function(fn) {
    this.fn = fn;
    this.successor = null;
};

Chain.prototype.setNextSuccessor = function(successor) {
    return this.successor = successor;
};

Chain.prototype.passRequest = function() {
    var ret = this.fn.apply(this, arguments);

    if (ret === 'nextSuccessor') {
        return this.successor && this.successor.passRequest.apply(this.successor,                           
               arguments);
    }

    return ret;
};

现在我们把 3 个订单函数分别包装成职责链的节点:

var chainOrder500 = new Chain( order500 ); 
var chainOrder200 = new Chain( order200 ); 
var chainOrderNormal = new Chain( orderNormal ); 

然后指定节点在职责链中的顺序:

chainOrder500.setNextSuccessor( chainOrder200 ); 
chainOrder200.setNextSuccessor( chainOrderNormal ); 

最后把请求传递给第一个节点:

chainOrder500.passRequest( 1, true, 500 ); // 输出:500 元定金预购,得到 100 优惠券 
chainOrder500.passRequest( 2, true, 500 ); // 输出:200 元定金预购,得到 50 优惠券 
chainOrder500.passRequest( 3, true, 500 ); // 输出:普通购买,无优惠券 
chainOrder500.passRequest( 1, false, 0 ); // 输出:手机库存不足

我们可以利用 JavaScript 的函数式特性,有一种更加方便的方法来创建职责链。

Function.prototype.after = function (fn) {
    var self = this;

    return function() {
        var ret = self.apply(this, arguments);
        
        if (ret === 'nextSuccessor') {
            return fn.apply(this, argument);
        }

        return ret;
    }
};

var order = order500.after(order200).after(orderNormal);
华为OD面试八股真题 - 操作系统 - 1 华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点 阅读详情

相关推荐

长鑫存储面试真题解析:DRAM工程师的工程直觉与产线思维

DRAM作为现代计算系统的底层存储基石,其性能与可靠性高度依赖半导体物理基础、工艺窗口控制和电路-系统协同设计。理解电荷保持机制、位线电容耦合效应、信号完整性约束等核心原理,是突破传统数字IC思维、构建真实产线语感的关键。在晶圆厂级工程实践中,TEM缺陷识别、BIST空间聚类分析、Retention失效定位等能力,直接关联良率爬坡与客户系统稳定性。本文聚焦长鑫存储一线技术面试中高频出现的工艺-电路-测试三维问题,融合‘电荷保持’‘信号完整性’等热词,还原DRAM工程师必备的系统性建模能力与闭环验证思维,覆盖

weixin_34293246的博客 337

用职责链模式来实现计算器

 四则运算式解释,并计算语法分析 using System;using System.Collections;namespace myChain...{    /**////     /// 自定义的CxyStack。    ///     public class cxyStack    ...{        private Stack mystack;        pu

佳泰生活 889

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念

摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字)

weixin_49761275的博客 4271

职责链模式——上机消费时间的计算

1.简介       1)模式概述:       2)核心: 2.UML与代码实现        1)结构:UML          结构:        模式组成:        2)java代码 public class Bridge{ //客户端实现 public static void main(String[]args) { Abstraction ab =

Cherie 1499

VMware ESXI 7.0实战:4T硬盘RAID1配置与性能调优全记录

本文详细记录了在VMware ESXI 7.0环境下,为Dell服务器配置两块4T硬盘组建RAID1并进行深度性能调优的全过程。文章重点解析了RAID控制器写入策略(Write-Back with BBU)、读取策略(Read-Ahead)的关键选择,并深入探讨了在ESXI虚拟机层面通过选用PVSCSI控制器、调整虚拟磁盘缓存策略(scsiX:Y.caching)等技巧,以最大化满足数据分析等IO密集型工作负载的需求,最终实现性能的显著提升。

gaochao的博客 259

processing与arduino互动编程

Arduino开发板对AVR单片机二次编译封装,无需考虑单片机编程寄存器、地址指针等复杂细节processing借助arduino读取各种传感器的数值,控制各种机电装置。

weixin_45679408的博客 824

JAVA职责链模式

JAVA职责链模式 通过本文将学习到 Table of Contents 前言 1、职责链模式的概念 2、职责链的UML图 3、职责链的实现 4、指责链的优缺点 5、职责链的使用场景 6、总结 前言 今天写了个小脚本,感觉还挺有意思的!写程序就是要写点自己觉得好玩的东西么。不然,写出来都没有一点成就感。还有今天庆祝WJ小姐姐可以溜了,还是挺好的。业务小姐姐教了我很多!接下...

帅哥威的博客 2564

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8335

职责链模式学习总结

目录 职责链模式 引言 定义 模式类图 实例 实例描述 实例类图 代码实现 模式扩展 纯与不纯的职责链模式 总结 模式优点 模式缺点 职责链模式 引言 在很多情况下,可以处理某个请求的对象不止一个,这些处理请求的对象可以构成一条链,请求按照这条链传递,这条链就称为职责链。职责链可以是一个条直线,一个环或者树形结构,最常见的职责链是直线型。 定义 英文定义...

江川的博客 2346

流体动力学仿真软件:CFX_(10).案例实践:复杂流场分析

在“Phases”选项卡中,定义参与仿真的不同相。例如,如果您要分析气液两相流,可以定义“Air”和“Water”两个相。

kkchenjj的博客 1690

数字 IC 笔试面试必考点(2)FPGA 开发流程

FPGA 的详细开发流程就是利用 EDA 开发工具对 FPGA 芯片进行开发的过程,所以 FPGA 芯片开发流程讲的并不是芯片的制造流程,区分于 IC 设计制造流程哟(芯片制造流程多麻烦,要好几十亿的费用呢,而且国内也貌似没有哪家像样的 Foundry 厂,除了台湾的 TSMC 在世界有立足之地,Fabless 的 IC 设计公司倒是挺强的如 Hisilicon,这也是它为什么会被 USA 针对的原因)。

新芯设计的博客 2012

设计模式之职责链模式(责任链模式)

设计模式之职责链模式(责任链模式)

来自上海的这位朋友 1751

unity从3D升级到urp管线,打包ab包后,材质全部变紫色

确保材质中的被转换为 URP 兼容的着色器。在打包 AssetBundle 时,确保所需的着色器被正确打包。确保运行 AB 包的目标项目中正确配置了 URP 渲染管线。如果加载后材质丢失,检查 AB 包的加载逻辑,确保材质正确应用了着色器。通过这些步骤,你应该能够解决从标准渲染管线切换到 URP 渲染管线后,材质在 AB 包中变紫色的问题。如果问题仍然存在,请根据具体错误日志进一步排查。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1964

Java设计模式之职责链模式介绍

职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B处理器处理完后再 传递给 C 处理器,以此类推,形成一个链条。

qq_25409421的博客 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式Python版 职责链模式

介绍了GOF设计模式中的职责链模式,用Python实现职责链模式示例,职责链模式分类。

分享、交流、合作 1320

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Javascript 职责链模式

Javascript 职责链模式

weixin_45172119的博客 593

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

15、职责链模式

职责链模式 文章目录职责链模式概述结构结构实现练习源代码纯与不纯的职责链模式纯的职责链模式不纯的职责链模式职责链模式优/缺点与适用环境优点缺点适用环境 概述 职责链模式:避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。 职责链又称为责任链模式,是一种对象行为型模式。 在系统中如果存在多个对象可以处理同一请求,则可以通过职责链模式将这些处理请求的对象连成一条链,让请求沿着该链进行传递。如果链上的对象可以处

阿涛的敲码时光 239

【设计模式】职责链模式(责任链模式) 行为型模式,纯与不纯的职责链模式

职责链模式是一种行为型设计模式,用于将请求的发送者和接收者解耦,通过构建处理对象链来动态分配请求。该模式适用于多级审批、事件处理等场景,如请假审批系统可按照请假天数由不同管理者处理(经理≤5天,主管≤10天,HR>10天)。核心组件包括抽象处理者(定义处理接口和链结构)和具体处理者(实现请求处理逻辑)。模式优势在于灵活调整处理流程,支持动态增减处理节点,降低系统耦合度。典型实现包含设置后继处理者方法和请求传递机制。

weixin_44131922的博客 807
上一篇: 发布-订阅模式
下一篇: 装饰者模式
也无风雨丶
博客等级 码龄10年 52粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值