【最佳实践】Go 责任链模式实现参数校验

news/2025/3/14 16:42:04/

这里我们使用责任链模式来创建一个参数校验的示例。在这个示例中,我们将实现一个简单的责任链来校验不同的参数条件。这种模式允许我们将多个校验步骤串联在一起,以便可以在不同的条件下进行灵活的校验。

设计思路

  1. 接口定义 (Validator)

    • 目的:定义责任链中每个节点的基本行为。
    • 设计思想:接口包含三个方法:
      • Validate(params *Params) error:执行具体的校验逻辑。
      • SetNext(v Validator) Validator:设置链中的下一个校验节点,实现链式调用。
      • Execute(params *Params) error:执行当前节点的 Validate 方法,并继续执行链中的下一个节点。
  2. 复用机制 (BaseValidator)

    • 目的:通过合成复用来实现校验链的连接机制。
    • 设计思想BaseValidator 是一个可复用的结构体,包含 nextValidator 字段(用于指向链中的下一个校验节点)和实现 SetNextExecute 方法。任何实现了 Validator 接口的结构体都可以通过嵌入 BaseValidator 来获得这些方法。
  3. 具体校验器

    • 目的:每个校验器负责校验请求中的某一特定参数。
    • 设计思想
      • 例如,NonEmptyValidator 用于检查字符串是否为空,PositiveNumberValidator 用于检查数字是否为正。
      • 这些校验器通过嵌入 BaseValidator 来获得链式调用的能力。
  4. 链式调用

    • 目的:通过链式调用初始化责任链,使代码结构清晰,增强可读性。
    • 设计思想:通过 SetNext 方法将各个校验器连接起来,使得责任链的逻辑关系一目了然。
  5. 扩展性

    • 目的:轻松扩展系统功能,支持更多的校验逻辑。
    • 设计思想:由于责任链是动态配置的,可以方便地添加、移除或重排校验器节点,而无需修改现有代码结构。

案例代码

以下是一个基于责任链模式的参数校验示例:

package mainimport ("errors""fmt"
)// Validator 接口定义了校验器的基本行为
type Validator interface {Validate(params *Params) errorSetNext(v Validator) ValidatorExecute(params *Params) error
}// BaseValidator 复用结构体,实现 Validator 接口的 SetNext 和 Execute 方法
type BaseValidator struct {nextValidator Validator
}// SetNext 设置下一个校验器
func (b *BaseValidator) SetNext(v Validator) Validator {b.nextValidator = vreturn v
}// Execute 执行当前校验和后续校验
func (b *BaseValidator) Execute(params *Params) error {if b.nextValidator != nil {if err := b.nextValidator.Validate(params); err != nil {return err}return b.nextValidator.Execute(params)}return nil
}// Params 结构体包含需要校验的参数
type Params struct {Name  stringAge   intEmail string
}// NonEmptyValidator 校验字符串是否为空
type NonEmptyValidator struct {BaseValidator
}func (v *NonEmptyValidator) Validate(params *Params) error {if params.Name == "" {return errors.New("name cannot be empty")}return nil
}// PositiveNumberValidator 校验数字是否为正
type PositiveNumberValidator struct {BaseValidator
}func (v *PositiveNumberValidator) Validate(params *Params) error {if params.Age <= 0 {return errors.New("age must be a positive number")}return nil
}// EmailFormatValidator 校验邮件格式(简单示例)
type EmailFormatValidator struct {BaseValidator
}func (v *EmailFormatValidator) Validate(params *Params) error {if params.Email == "" || !contains(params.Email, "@") {return errors.New("invalid email format")}return nil
}// contains 是一个简单的字符串包含判断函数
func contains(s, substr string) bool {return len(s) >= len(substr) && (s[:len(substr)] == substr || contains(s[1:], substr))
}func main() {params := &Params{Name:  "John Doe",Age:   30,Email: "johndoe@example.com",}// 初始化校验链validator := &NonEmptyValidator{}validator.SetNext(&PositiveNumberValidator{}).SetNext(&EmailFormatValidator{})// 执行校验err := validator.Execute(params)if err != nil {fmt.Println("Validation failed:", err)} else {fmt.Println("Validation succeeded")}
}

http://www.ppmy.cn/news/1579103.html

相关文章

React hook钩子性能优化Hooks的面试常考题目

根据,提到了常用的Hooks有useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef,还有其他如useLayoutEffect和useImperativeHandle。和也提到了类似的Hooks,并且强调了useEffect的重要性。详细解释了useState、useEffect、useMemo和useCallback的区别…

计算机视觉领域开源数据集资源整理

1. 目标检测数据集 1.1 COCO2017 数据集 COCO2017 是 2017 年发布的 COCO 数据集的一个版本&#xff0c;主要用于 COCO 在 2017 年后持有的物体检测任务、关键点检测任务和全景分割任务。 1.2 火焰和烟雾图像数据集 数据集链接&#xff1a;http://m6z.cn/6fzn0f 该数据集由…

UE5 RVT 制作场景交互 - 遮罩

RVT可以通过物体制作场景的RVT的贴图遮罩绘制 首先放一个Runtime Virtual Texture Volume在场景里面 设置一个合理的大小 创建一个RVT 这里有你想要的存储的通道和贴图精度 将才创建的RVT放到Runtime Virtual Texture Volume上去 现在放一个平面到Runtime Virtual Texture Volu…

c++之STL库

STL 基本概念一.容器&#xff08;Containers&#xff09;1.序列容器&#xff08;Sequence Containers&#xff09;&#xff1a;2.关联容器&#xff08;Associative Containers&#xff09;&#xff1a;3.无序容器&#xff08;Unordered Containers&#xff09;&#xff1a;4.迭…

LGA封装 Z3588开发板,8K视频编解码

Z3588 是基于瑞芯微 RK3588 CPU 研发开发板&#xff0c;RK3588 是瑞芯微推出的新一代旗舰级高端处理器&#xff0c;采用 8nm 工艺设计&#xff0c;搭载四核 A76 四核 A55 的八核 CPU 和 Arm 高性能 GPU&#xff0c;内置 6T 算力的 NPU。 LGA&#xff08;Land Grid Array&#x…

【Python】PyQt5在PyCharm的配置与应用

一、安装pycharm与python版本 Download PyCharm: The Python IDE for data science and web development by JetBrains Professional&#xff1a;专业版&#xff0c;收费&#xff0c;功能齐全 Community&#xff1a;社区版&#xff0c;免费&#xff0c;功能阉割 二、升级pip与…

缓存和客户端数据存储体系(Ark Data Kit)--- 应用数据持久化(首选项持久化、K-V、关系型数据库)持续更新中...

Core File Kit做怎删改查操作不便&#xff0c;用Ark Data Kit。 功能介绍 ArkData &#xff08;方舟数据管理&#xff09;为开发者提供数据存储、数据管理和数据同步能力&#xff0c;比如联系人应用数据可以保存到数据库中&#xff0c;提供数据库的安全、可靠以及共享访问等管…

Python 逆向工程:2025 年能破解什么?

有没有想过在复杂的软件上扭转局面&#xff1f;到 2025 年&#xff0c;Python 逆向工程不仅仅是黑客的游戏&#xff0c;它是开发人员、安全专业人员和好奇心强的人解开编译代码背后秘密的强大方法。无论您是在剖析恶意软件、分析 Python 应用程序的工作原理&#xff0c;还是学习…