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

Go语言设计模式:行为型模式

Go语言设计模式行为型模式一、行为型模式概述行为型模式关注对象之间的通信和职责分配描述对象如何协作以及如何分配职责。Go语言中的行为型模式特点接口驱动通过接口定义行为契约并发安全考虑并发场景下的协作组合实现通过组合而非继承实现行为复用二、策略模式策略模式定义一系列算法把它们封装起来并使它们可以互相替换。package strategy type Strategy interface { Execute(a, b int) int } type AddStrategy struct{} func (a *AddStrategy) Execute(x, y int) int { return x y } type SubtractStrategy struct{} func (s *SubtractStrategy) Execute(x, y int) int { return x - y } type MultiplyStrategy struct{} func (m *MultiplyStrategy) Execute(x, y int) int { return x * y } type Context struct { strategy Strategy } func (c *Context) SetStrategy(strategy Strategy) { c.strategy strategy } func (c *Context) ExecuteStrategy(a, b int) int { return c.strategy.Execute(a, b) }三、观察者模式观察者模式定义对象间的一对多依赖当一个对象状态改变时所有依赖它的对象都会收到通知。package observer type Observer interface { Update(message string) } type Subject interface { Attach(observer Observer) Detach(observer Observer) Notify(message string) } type ConcreteSubject struct { observers []Observer } func (s *ConcreteSubject) Attach(observer Observer) { s.observers append(s.observers, observer) } func (s *ConcreteSubject) Detach(observer Observer) { for i, obs : range s.observers { if obs observer { s.observers append(s.observers[:i], s.observers[i1:]...) break } } } func (s *ConcreteSubject) Notify(message string) { for _, observer : range s.observers { observer.Update(message) } } type ConcreteObserver struct { name string } func (o *ConcreteObserver) Update(message string) { println(o.name received: message) }四、命令模式命令模式将请求封装成对象使你可以用不同的请求对客户进行参数化。package command type Command interface { Execute() Undo() } type Receiver struct{} func (r *Receiver) Action() { println(Receiver action) } func (r *Receiver) ReverseAction() { println(Receiver reverse action) } type ConcreteCommand struct { receiver *Receiver } func (c *ConcreteCommand) Execute() { c.receiver.Action() } func (c *ConcreteCommand) Undo() { c.receiver.ReverseAction() } type Invoker struct { history []Command } func (i *Invoker) SetCommand(command Command) { command.Execute() i.history append(i.history, command) } func (i *Invoker) Undo() { if len(i.history) 0 { command : i.history[len(i.history)-1] command.Undo() i.history i.history[:len(i.history)-1] } }五、迭代器模式迭代器模式提供一种方法顺序访问聚合对象中的各个元素而又不暴露该对象的内部表示。package iterator type Iterator interface { HasNext() bool Next() interface{} } type Iterable interface { CreateIterator() Iterator } type ConcreteIterator struct { collection []interface{} index int } func (i *ConcreteIterator) HasNext() bool { return i.index len(i.collection) } func (i *ConcreteIterator) Next() interface{} { if i.HasNext() { item : i.collection[i.index] i.index return item } return nil } type ConcreteCollection struct { items []interface{} } func (c *ConcreteCollection) CreateIterator() Iterator { return ConcreteIterator{collection: c.items} } func (c *ConcreteCollection) Add(item interface{}) { c.items append(c.items, item) }六、模板方法模式模板方法模式定义一个算法的骨架将一些步骤延迟到子类中实现。package template type AbstractClass interface { PrimitiveOperation1() PrimitiveOperation2() TemplateMethod() } type ConcreteClass struct{} func (c *ConcreteClass) PrimitiveOperation1() { println(Primitive operation 1) } func (c *ConcreteClass) PrimitiveOperation2() { println(Primitive operation 2) } func (c *ConcreteClass) TemplateMethod() { c.PrimitiveOperation1() c.PrimitiveOperation2() println(Template method completed) }七、状态模式状态模式允许对象在内部状态改变时改变它的行为对象看起来好像修改了它的类。package state type State interface { Handle(context *Context) } type ConcreteStateA struct{} func (s *ConcreteStateA) Handle(context *Context) { println(Handling in state A) context.SetState(ConcreteStateB{}) } type ConcreteStateB struct{} func (s *ConcreteStateB) Handle(context *Context) { println(Handling in state B) context.SetState(ConcreteStateA{}) } type Context struct { state State } func (c *Context) SetState(state State) { c.state state } func (c *Context) Request() { c.state.Handle(c) }八、责任链模式责任链模式使多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。package chain type Handler interface { SetNext(handler Handler) Handler Handle(request string) string } type AbstractHandler struct { next Handler } func (h *AbstractHandler) SetNext(handler Handler) Handler { h.next handler return handler } func (h *AbstractHandler) Handle(request string) string { if h.next ! nil { return h.next.Handle(request) } return No handler found } type ConcreteHandlerA struct { AbstractHandler } func (h *ConcreteHandlerA) Handle(request string) string { if request A { return Handled by Handler A } return h.AbstractHandler.Handle(request) } type ConcreteHandlerB struct { AbstractHandler } func (h *ConcreteHandlerB) Handle(request string) string { if request B { return Handled by Handler B } return h.AbstractHandler.Handle(request) }九、中介者模式中介者模式定义一个对象封装一系列对象之间的交互。package mediator type Mediator interface { Send(message string, colleague Colleague) } type Colleague interface { Send(message string) Receive(message string) } type ConcreteMediator struct { colleagues []Colleague } func (m *ConcreteMediator) AddColleague(colleague Colleague) { m.colleagues append(m.colleagues, colleague) } func (m *ConcreteMediator) Send(message string, sender Colleague) { for _, colleague : range m.colleagues { if colleague ! sender { colleague.Receive(message) } } } type ConcreteColleague struct { name string mediator Mediator } func (c *ConcreteColleague) Send(message string) { println(c.name sends: message) c.mediator.Send(message, c) } func (c *ConcreteColleague) Receive(message string) { println(c.name receives: message) }十、行为型模式实战场景日志处理责任链package chain type LogHandler interface { SetNext(handler LogHandler) LogHandler Handle(logLevel string, message string) } type BaseHandler struct { next LogHandler } func (h *BaseHandler) SetNext(handler LogHandler) LogHandler { h.next handler return handler } type DebugHandler struct { BaseHandler } func (h *DebugHandler) Handle(logLevel, message string) { if logLevel DEBUG { println([DEBUG] message) } else if h.next ! nil { h.next.Handle(logLevel, message) } } type InfoHandler struct { BaseHandler } func (h *InfoHandler) Handle(logLevel, message string) { if logLevel INFO { println([INFO] message) } else if h.next ! nil { h.next.Handle(logLevel, message) } } type ErrorHandler struct { BaseHandler } func (h *ErrorHandler) Handle(logLevel, message string) { if logLevel ERROR { println([ERROR] message) } else if h.next ! nil { h.next.Handle(logLevel, message) } }十一、总结行为型设计模式帮助我们管理对象间的通信和职责策略模式封装算法支持运行时切换观察者模式一对多依赖状态变化通知命令模式封装请求支持撤销/重做迭代器模式统一遍历集合模板方法模式定义算法骨架状态模式状态驱动行为变化责任链模式请求链式处理中介者模式封装对象间交互在Go语言中应用这些模式时要充分利用接口和组合特性保持代码的灵活性和可维护性。

相关文章:

Go语言设计模式:行为型模式

Go语言设计模式:行为型模式 一、行为型模式概述 行为型模式关注对象之间的通信和职责分配,描述对象如何协作以及如何分配职责。 Go语言中的行为型模式特点 接口驱动:通过接口定义行为契约并发安全:考虑并发场景下的协作组合实现&a…...

LabVIEW生产者消费者模式:队列解耦与多任务架构实战

1. 项目概述:从“单线程”到“流水线”的思维跃迁如果你用过LabVIEW,大概率写过那种“一个While循环包打天下”的程序。按钮事件、数据采集、逻辑处理、界面更新,全都塞在一个循环里,顺序执行。程序简单时还好,一旦任务…...

天地协同:卫星如何成为5G物联网“组合拳”的关键一环

未来的物联网连接格局并非“卫星取代地面”或“地面压制卫星”的零和博弈,而是一个基于场景需求、优势互补的“组合式”解决方案。卫星连接的价值在于补充和增强更广泛的连接组合,与5G等地面蜂窝网络协同工作,共同构建一张无处不在、经济高效…...

初创公司如何用Taotoken统一管理多个AI应用接口

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司如何用Taotoken统一管理多个AI应用接口 对于资源有限的初创团队而言,快速、低成本地集成人工智能能力是提升产…...

Python开发者三步完成Taotoken API密钥配置与调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python开发者三步完成Taotoken API密钥配置与调用 对于希望快速接入大模型能力的Python开发者而言,Taotoken平台提供的…...

taotoken如何为ubuntu上的ai应用提供稳定多模型api支持

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken如何为ubuntu上的ai应用提供稳定多模型api支持 在Ubuntu服务器上部署和运行AI应用,是许多开发团队的标准实践。…...

GDB断点管理保姆级指南:从查看、删改到批量操作,告别调试混乱

GDB断点管理保姆级指南:从查看、删改到批量操作,告别调试混乱 调试大型C/C项目时,断点管理往往成为工程师的痛点。想象一下,当你在一个包含数十个源文件的项目中设置了50多个断点,每次调试时都要在密密麻麻的断点列表中…...

源代码论文分享|基于Spring Boot的装饰工程管理系统!

做工程管理系统的同学,真的别一开始就硬啃空白项目。 尤其是装饰工程这种题目,看起来只是“管理系统”,但真写起来会发现:客户信息、工程项目、材料、施工进度、人员安排、费用统计……每一块都能展开。如果没有一个完整项目做参…...

源代码论文分享|图书管理系统!

这份「图书管理系统」源码和论文,适合你在最需要“有个靠谱参考”的时候打开。 不是那种只放一堆代码、让人自己猜怎么跑的资料,也不是标题写得很大、内容却很空的论文模板。它更像一份已经整理好的项目包:有源码、有论文,可以直…...

深入TMS320C6678中断控制器:从CIC、INTC到Event Combiner的底层机制图解

深入解析TMS320C6678中断控制器架构与实现机制 在嵌入式系统开发领域,中断处理机制的设计与实现往往是决定系统实时性和可靠性的关键因素。TMS320C6678作为一款高性能多核DSP处理器,其中断控制系统采用了分层式设计理念,通过片级中断控制器(C…...

Mermaid Live Editor:免费实时图表编辑器终极指南,让技术绘图简单到令人惊叹

Mermaid Live Editor:免费实时图表编辑器终极指南,让技术绘图简单到令人惊叹 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub…...

Android音视频应用开发中的性能与功耗优化策略

引言 随着移动设备的普及和5G网络的推进,Android音视频应用(如视频会议、直播平台)已成为日常生活和工作的重要组成部分。然而,这些应用往往面临性能瓶颈(如卡顿、延迟)和功耗过高(如电池快速耗尽)的问题。作为一名Android音视频应用开发工程师,掌握性能优化和功耗优…...

Taotoken用量看板与账单追溯功能在项目复盘中的实际价值

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板与账单追溯功能在项目复盘中的实际价值 1. 复盘场景与数据需求 在项目月度复盘会议上,技术团队经常面…...

鸿蒙与Kotlin跨平台开发中的性能与功耗深度优化实践

摘要:本文聚焦KMP(Kotlin Multiplatform)与鸿蒙(ArkTS)集成开发中的性能与功耗优化,结合架构设计、系统级调优及实战案例,提供可落地的解决方案。全文涵盖核心优化领域:内存管理、渲染管线、跨进程通信、功耗模型分析等,适用于中大型项目迁移与重构。 一、KMP跨平台模…...

电赛信号分析不止于FFT:用STM32F407的ADC-DMA与加窗技术提升THD测量稳定性的实操指南

电赛信号分析进阶:STM32F407的ADC-DMA与加窗技术实战 在电子设计竞赛的信号分析环节,许多队伍止步于基础的FFT实现,却忽略了采样质量与频谱处理对THD(总谐波失真)测量结果的深远影响。当你的系统已经能够输出波形和基础…...

比特币钱包密码恢复终极指南:如何找回丢失的密码和助记词

比特币钱包密码恢复终极指南:如何找回丢失的密码和助记词 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assistance in trying…...

30秒上手AI视频插帧:用Flowframes让视频帧率翻倍的终极指南

30秒上手AI视频插帧:用Flowframes让视频帧率翻倍的终极指南 【免费下载链接】flowframes Flowframes Windows GUI for video interpolation using DAIN (NCNN) or RIFE (CUDA/NCNN) 项目地址: https://gitcode.com/gh_mirrors/fl/flowframes 想要让普通视频瞬…...

常见 PE 启动盘

文章目录常见 PE 启动盘一、强烈推荐 纯净无捆绑类二、功能强大 可选推广类三、老牌经典 捆绑较多类四、官方原版常见 PE 启动盘 这里整理了一份常见的PE启动盘大全,按纯净度和口碑分类,并附上官网或可靠的下载渠道。 一、强烈推荐 纯净无捆绑类 这…...

5分钟解锁B站大会员4K视频下载!这个开源工具让你轻松收藏任何B站内容

5分钟解锁B站大会员4K视频下载!这个开源工具让你轻松收藏任何B站内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在…...

YouTube 视频翻译中文:基于 Whisper + FFmpeg 的自动化流水线实战

一、背景 YouTube 视频翻译中文,本质上是将外语视频通过语音识别(ASR)、文本翻译(NMT)、语音合成(TTS)三个环节处理后,重新合成为中文版本。每一个环节都有成熟的开源工具链支持&am…...

三步搞定Windows磁盘空间不足:WinDirStat终极清理方案

三步搞定Windows磁盘空间不足:WinDirStat终极清理方案 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat 你是否经常遇到Windows…...

YOLOv5/v7改进系列——融合EfficientNetV2主干网络的轻量化部署实践

1. 为什么选择EfficientNetV2作为YOLO的主干网络 在目标检测领域,YOLO系列算法因其出色的实时性能而广受欢迎。但当我们把YOLOv5/v7部署到移动端或嵌入式设备时,模型的计算量和内存占用就成了必须面对的难题。这时候,EfficientNetV2就像一位轻…...

微信小程序wx.navigateTo传参实战:从基础到动态数据绑定

1. 微信小程序页面跳转基础入门 第一次接触微信小程序开发时,页面跳转是最基础也最常用的功能之一。wx.navigateTo这个API就像是一座连接不同页面的桥梁,让用户能在小程序的不同功能模块间自由穿梭。想象一下,你正在开发一个电商小程序&…...

别再只会用DC-DC了!手把手教你用SPX3819这类LDO芯片,搞定5V转3.3V的电路设计(附外围电路图)

从零实战:用SPX3819打造高效5V转3.3V电源系统 当你在深夜调试一块STM32开发板时,突然发现USB供电的5V电压让芯片发烫——这种场景是否似曾相识?对于嵌入式开发者而言,构建一个稳定、低噪声的3.3V供电系统往往是项目成功的第一步。…...

物业临时工排班管理的技术破局:栎偲考勤神器的AI与离线方案详解

物业行业临时工排班管理长期面临三大技术痛点:人员流动性大导致班制匹配混乱、多场景打卡数据碎片化、中小企业部署成本高。作为专注考勤工具实测的博主,今天拆解栎偲考勤神器如何通过AI算法与轻量化技术,针对性解决物业临时工排班管理的核心…...

MAA明日方舟小助手:让游戏回归乐趣的智能伙伴

MAA明日方舟小助手:让游戏回归乐趣的智能伙伴 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.com…...

Arm Neoverse CMN-650一致性网格网络架构与配置解析

1. Arm Neoverse CMN-650 一致性网格网络架构解析在现代多核处理器设计中,一致性网格网络(Coherent Mesh Network)已成为解决核心间通信瓶颈的关键技术。Arm Neoverse CMN-650作为第二代一致性互连解决方案,其架构设计体现了三个核…...

C++、汇编与易语言:三大编程语言深度对比

好的,我们来比较一下 C、汇编语言和易语言这三种编程语言的主要区别:抽象层级和与硬件的距离:汇编语言: 这是最低级的编程语言之一。它使用特定于 CPU 架构的 助记符(如 MOV, ADD, JMP)来直接操作 寄存器 和…...

如何使用ubuntu搭建一个无盘PC启动服务器

启动windows,1. 安装tftp服务器sudo apt install tftpd-hpa2. 设置tftp,sudo systemctl restart tftpd-hpasudo nano /etc/default/tftpd-hpa# /etc/default/tftpd-hpaTFTP_USERNAME"tftp" TFTP_DIRECTORY"/srv/tftp" TFTP_ADDRESS":69" TFTP_OP…...

探索OpenBoardView:硬件工程师的PCB分析利器

探索OpenBoardView:硬件工程师的PCB分析利器 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 在现代电子硬件开发与维修领域,面对复杂的电路板设计文件,工程师们常常需要…...