news 2026/5/16 20:50:54

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go语言设计模式:行为型模式

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

一、行为型模式概述

行为型模式关注对象之间的通信和职责分配,描述对象如何协作以及如何分配职责。

Go语言中的行为型模式特点

  1. 接口驱动:通过接口定义行为契约
  2. 并发安全:考虑并发场景下的协作
  3. 组合实现:通过组合而非继承实现行为复用

二、策略模式

策略模式定义一系列算法,把它们封装起来,并使它们可以互相替换。

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[i+1:]...) 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) } }

十一、总结

行为型设计模式帮助我们管理对象间的通信和职责:

  1. 策略模式:封装算法,支持运行时切换
  2. 观察者模式:一对多依赖,状态变化通知
  3. 命令模式:封装请求,支持撤销/重做
  4. 迭代器模式:统一遍历集合
  5. 模板方法模式:定义算法骨架
  6. 状态模式:状态驱动行为变化
  7. 责任链模式:请求链式处理
  8. 中介者模式:封装对象间交互

在Go语言中应用这些模式时,要充分利用接口和组合特性,保持代码的灵活性和可维护性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 20:48:54

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

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

作者头像 李华
网站建设 2026/5/16 20:41:06

Linux内核模块化驱动开发:从框架原理到嵌入式实战

1. 项目概述&#xff1a;从单内核到模块化设计的演进 在嵌入式开发领域&#xff0c;Linux内核的庞大与复杂常常让初学者望而生畏。一个直观的疑问是&#xff1a;为什么一个内核要包含成千上万个驱动&#xff1f;如果我的设备只需要一个串口和一个网卡&#xff0c;为什么启动时要…

作者头像 李华
网站建设 2026/5/16 20:40:05

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

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

作者头像 李华
网站建设 2026/5/16 20:39:02

MBZUAI与南京大学联合揭示AI模型微调中的优化器冲突之谜

这项由穆罕默德本扎耶德人工智能大学&#xff08;MBZUAI&#xff09;与南京大学联合开展的研究&#xff0c;发表于2026年第43届国际机器学习大会&#xff08;ICML&#xff09;&#xff0c;论文预印本编号为arXiv:2605.10468&#xff0c;于2026年5月11日公开。感兴趣的读者可通过…

作者头像 李华
网站建设 2026/5/16 20:38:12

2026最权威的六大AI辅助论文神器推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 飞速发展着的人工智能技术&#xff0c;在学术领域里应用变得越发广泛&#xff0c;特别是在毕…

作者头像 李华
网站建设 2026/5/16 20:36:46

机器人抓取研究一体化工作空间:从仿真到硬件部署的完整开发指南

1. 项目概述&#xff1a;一个为机器人抓取研究量身定制的核心工作空间如果你正在机器人抓取、灵巧操作或者具身智能领域做研究或开发&#xff0c;大概率会遇到一个经典难题&#xff1a;如何快速搭建一个既能进行算法仿真验证&#xff0c;又能无缝对接真实机器人硬件&#xff0c…

作者头像 李华