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

装饰模式(Decorator Pattern)在 Go 语言中的应用

文章目录

    • 引言
    • 什么是装饰模式?
    • 在Go语言中的应用
      • 定义接口
      • 实现具体逻辑
      • 创建装饰器
      • 使用装饰器
    • 装饰模式 vs 中间件
      • 装饰模式
      • 中间件
      • 区别
    • 总结

引言

在软件开发中,设计模式是解决常见问题的模板。装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你在运行时动态地给对象添加职责。本文将详细介绍装饰模式在 Go 语言中的应用,并通过一个具体的例子来展示其使用方法。此外,我们还将探讨装饰模式与中间件的区别,帮助你更好地理解这两种模式的应用场景。

什么是装饰模式?

装饰模式的核心思想是通过创建一个包装类(装饰器)来动态地给对象添加新的功能。这种方式比继承更灵活,因为它不会改变原始类的结构,同时还能在运行时动态地添加或移除功能。

在Go语言中的应用

假设我们有一个权限校验接口 RightsChecker,它负责检查用户的权限。我们希望在权限校验的过程中添加一些额外的行为,比如日志记录、权限检查等。下面是一个具体的实现示例:

定义接口

首先,定义 RightsChecker 接口:

type CheckRightsRequest struct {Authorization string `header:"authorization" validate:"required"`User          string `form:"user"`OpenKfID      string `json:"open_kf_id" validate:"required"`ChildrenId    int64  `json:"children_id,optional"` // 档案id
}type CheckRightsResponse struct {RemainTimes int64 `json:"remain_times"`Enabled     int64 `json:"enabled"`
}type RightsChecker interface {CheckRights(req *CheckRightsRequest) (resp *CheckRightsResponse, err error)
}

实现具体逻辑

接下来,实现具体的权限校验逻辑 CheckRightsLogic

type CheckRightsLogic struct {ctx    context.ContextsvcCtx context.Context
}func (l *CheckRightsLogic) CheckRights(req *CheckRightsRequest) (resp *CheckRightsResponse, err error) {// 原始的权限校验逻辑riskService := risk.NewRisk()enable, times, err := riskService.Check()if err != nil {return nil, err}resp = &CheckRightsResponse{RemainTimes: times,Enabled:     enable,}return resp, nil
}

创建装饰器

然后,创建一个装饰器 RightsCheckerDecorator,在其中添加额外的行为:

type RightsCheckerDecorator struct {checker RightsChecker
}func (d *RightsCheckerDecorator) CheckRights(req *CheckRightsRequest) (resp *CheckRightsResponse, err error) {// 在这里可以添加额外的行为,例如日志记录、权限检查等fmt.Println("Logging request:", req)// 调用嵌入的 checker 的 CheckRights 方法resp, err = d.checker.CheckRights(req)if err != nil {fmt.Println("Error occurred during rights check:", err)return}// 在这里可以添加额外的行为,例如日志记录、结果处理等fmt.Println("Logging response:", resp)return
}

使用装饰器

最后,创建装饰器并使用它:

func NewRightsCheckerDecorator(checker RightsChecker) RightsChecker {return &RightsCheckerDecorator{checker: checker,}
}func main() {logic := &CheckRightsLogic{ctx: context.Background(), svcCtx: context.Background()}decoratedChecker := NewRightsCheckerDecorator(logic)// 使用装饰后的 checker 进行权限校验req := &CheckRightsRequest{Authorization: "Bearer token123",User:          "user456",OpenKfID:      "kf123",ChildrenId:    12345,}resp, err := decoratedChecker.CheckRights(req)if err != nil {// 处理错误fmt.Println(err)}// 处理响应fmt.Println(resp)
}

装饰模式 vs 中间件

装饰模式

  • 定义:装饰模式通过创建一个包装类(装饰器)来动态地给对象添加新的功能。
  • 应用场景:适用于需要在运行时动态地给对象添加职责的情况,特别是在不改变原有对象结构的前提下。
  • 特点
    • 灵活性高,可以在运行时动态地添加或移除功能。
    • 不改变原有对象的结构。
    • 适合复杂的业务逻辑,可以逐步添加功能。

中间件

  • 定义:中间件是一种位于请求处理链中的组件,通常用于处理请求和响应的通用任务,如日志记录、认证、错误处理等。
  • 应用场景:适用于 Web 框架、API 服务器等需要处理大量请求的场景。
  • 特点
    • 通常用于处理请求和响应的通用任务。
    • 可以在请求处理链中按顺序执行多个中间件。
    • 适合处理跨切面的通用逻辑,如日志记录、认证等。

区别

  1. 目的

    • 装饰模式主要用于给对象动态地添加职责,而不改变原有对象的结构。
    • 中间件主要用于处理请求和响应的通用任务,通常用于 Web 框架和 API 服务器。
  2. 使用场景

    • 装饰模式适用于需要在运行时动态地给对象添加功能的场景。
    • 中间件适用于需要处理大量请求的场景,特别是在 Web 开发中。
  3. 实现方式

    • 装饰模式通过创建包装类来实现。
    • 中间件通过在请求处理链中按顺序执行多个中间件来实现。

总结

装饰模式是一种强大的设计模式,适用于需要在运行时动态地给对象添加职责的场景。通过本文的介绍和示例代码,相信你已经掌握了如何在 Go 语言中使用装饰模式。同时,我们也探讨了装饰模式与中间件的区别,帮助你更好地选择合适的设计模式来解决实际问题。

如果你有任何问题或建议,欢迎留言交流!

关注我哦

相关文章:

装饰模式(Decorator Pattern)在 Go 语言中的应用

文章目录 引言什么是装饰模式?在Go语言中的应用定义接口实现具体逻辑创建装饰器使用装饰器 装饰模式 vs 中间件装饰模式中间件区别 总结 引言 在软件开发中,设计模式是解决常见问题的模板。装饰模式(Decorator Pattern)是一种结构…...

Windows系统部署redis自启动服务

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…...

34岁IT男的职场十字路口:是失业预警,还是转型契机?

在信息技术这片充满机遇与挑战的广袤领域,34岁,一个看似正值壮年却暗藏危机的年龄,成为了许多IT男性不得不面对的职场考验。当“34岁现象”逐渐凸显,我们不禁要问:在这个快速变化的时代,34岁的IT男&#xf…...

复试经验分享《三、计算机学科专业基础综合》- 数据结构篇

复试经验分享 三、计算机学科专业基础综合 3.1 数据结构 3.1.1 概念 时间复杂度 时间复杂度是指执行算法所需要的计算工作量一般情况下,按照基本操作次数最多的输入来计算时间复杂度,并且多数情况下我们去最深层循环内的语句所描述的操作作为基本操作…...

数学建模算法与应用 第16章 优化与模拟方法

目录 16.1 线性规划 Matlab代码示例:线性规划求解 16.2 整数规划 Matlab代码示例:整数规划求解 16.3 非线性规划 Matlab代码示例:非线性规划求解 16.4 蒙特卡洛模拟 Matlab代码示例:蒙特卡洛模拟计算圆周率 习题 16 总结…...

windows下安装、配置neo4j并服务化启动

第一步:下载Neo4j压缩包 官网下载地址:https://neo4j.com/download-center/ (官网下载真的非常慢,而且会自己中断,建议从以下链接下载) 百度网盘下载地址:链接:https://pan.baid…...

【JVM】—深入理解G1回收器—回收过程详解

深入理解G1回收器—回收过程详解 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 文章目录 深入理解G1回收…...

2、CSS笔记

文章目录 二、CSS基础CSS简介CSS语法规范CSS代码风格CSS选择器CSS基础选择器标签选择器类选择器--最常用id选择器通配符选择器 CSS复合选择器交集选择器--重要并集选择器--重要后代选择器--最常用子代选择器--重要兄弟选择器相邻兄弟选择器通用兄弟选择器 属性选择器伪类选择器…...

使用XML实现MyBatis的基础操作

目录 前言 1.准备工作 1.1⽂件配置 1.2添加 mapper 接⼝ 2.增删改查操作 2.1增(Insert) 2.2删(Delete) 2.3改(Update) 2.4查(Select) 前言 接下来我们会使用的数据表如下: 对应的实体类为:UserInfo 所有的准备工作都在如下文章。 MyBatis 操作…...

智汇云舟亮相WAFI世界农业科技创新大会,并参编数字农业产业图谱

10月10日,2024WAFI世界农业科技创新大会农食行业创新与投资峰会在北京金海湖国际会展中心举行。中国农业大学MBA教育中心主任、教授付文阁、平谷区委常委、统战部部长刘堃、华为公共事业军团数字政府首席专家刘丹、荷兰瓦赫宁根大学前校长Aalt Dijkhuizen、牧原食品…...

昇思MindSpore进阶教程--数据处理性能优化(中)

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 shuffle性能优化 shuffle操作主要是对有…...

Vivado - Aurora 8B/10B IP

目录 1. 简介 2. 设计调试 2.1 Physical Layer 2.2 Link Layer 2.3 Receiver 2.4 IP 接口 2.5 调试过程 2.5.1 Block Design 2.5.2 释放 gt_reset 2.5.3 观察数据 3. 实用技巧 3.1 GT 坐标与布局 3.1.1 选择器件并进行RTL分析 3.1.2 进入平面设计 3.1.3 收发器布…...

图(Java语言实现)

一、图的概念 顶点(Vertex):图中的数据元素,我们称之为顶点,图至少有一个顶点(非空有穷集合)。 边(Edge):顶点之间的关系用边表示。 1.图(Graph…...

GPT 生成绘画_Java语言例子_超详细

基于spring ai :简化Java AI开发,提升效率与维护性 过去在使用Java编写AI应用时,主要困境在于缺乏统一的标准化封装,开发者需要针对不同的AI服务提供商查阅各自独立的文档并进行接口对接,这不仅增加了开发的工作量&am…...

华为OD机试 - 小朋友分组最少调整次数 - 贪心算法(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...

数字农业与遥感监测平台

随着全球人口的增长和气候变化的挑战,农业的可持续发展变得尤为重要。数字农业作为现代农业发展的重要方向,正逐渐成为提高农业生产效率、保障粮食安全的关键手段。遥感技术作为数字农业的重要组成部分,通过监测作物生长状况、土壤湿度、病虫…...

2023年12月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

一、单选题 1、下列程序运行的结果是?( ) print(hello) print(world) A.helloworld B.hello world C.hello world D.helloworld 正确答案:B 答案解析:本题考察的 Python 编程基础,print 在打印时…...

【优选算法】——双指针(下篇)!

🌈个人主页:秋风起,再归来~ 🔥系列专栏:C刷题算法总结 🔖克心守己,律己则安 目录 1、有效三角形的个数 2、查找总价值为目标值的两个商品 3、三数之和 4、四数之和 5、完结散花 1、有…...

C#中函数重载的说明

一.函数重载的基本概念 C# 中的函数重载是指在同一个类中定义多个同名的函数,但这些函数的参数类型、参数个数、参数顺序等不同,以便适应不同的调用需求,增加代码的兼容性。 二.函数重载的作用 2.1定义多个相类似的函数,减少函…...

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)) 广度优先搜索理论基础bfs与dfs的对比(思维导图)&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

windows系统MySQL安装文档

概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...