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

golang观察者设计模式

观察者模式简介

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者对象都会得到通知并自动更新。观察者模式使得对象之间的耦合度降低,提高了系统的灵活性和可维护性。

结构

观察者模式包含以下几个角色:
1. 主题(Subject):定义了观察者注册、移除和通知的方法。
2. 具体主题(ConcreteSubject):实现主题接口,维护一个观察者列表,当状态发生变化时通知所有观察者。
3. 观察者(Observer):定义了一个更新接口,当接收到主题的通知时更新自己。
4. 具体观察者(ConcreteObserver):实现观察者接口,更新自己的状态以与主题的状态保持一致。

应用场景

  • 当一个对象的状态或数据更新需要其他对象同步更新,或者一个对象的更新需要依赖另一个对象的更新时,可以使用观察者模式。
  • 适用于对象只需要通知其他对象其状态变化而不需要知道其他对象细节的情况,比如消息推送机制。

优缺点

优点

  • 降低耦合度:观察者模式通过将观察者和主题解耦,使得它们可以独立变化,提高了系统的灵活性和可维护性。
  • 支持广播通信:主题对象可以向所有注册的观察者发送通知,实现广播通信。

缺点

  • 可能导致性能问题:如果观察者数量过多,通知所有观察者可能会导致性能问题。
  • 可能导致内存泄漏:如果观察者没有及时解除注册,可能会导致内存泄漏。

示例

在Go语言中实现观察者模式可以通过接口和通道(channel)来实现。下面是一个简单的例子,演示如何使用Go语言实现观察者模式:

package main

import "fmt"

// Observer接口定义了观察者应该实现的方法。
type Observer interface {
	RevMsg(wd int) // 接受信息
}

// Subject接口定义了主题(被观察者)应该实现的方法。
type Subject interface {
	SendMsg(wd int)     // 发送消息给所有注册的观察者
	Notify()           // 通知所有注册的观察者
	RegisterObserver(Observer) // 注册一个新的观察者
}

// User结构体表示一个具体的观察者。
type User struct {
	Name string
}

// RevMsg是User结构体的方法,实现了Observer接口。
// 它是一个指针接收者方法,这意味着它会操作原始的User实例。
func (u *User) RevMsg(wd int) {
	fmt.Println(u.Name, "现在温度", wd, "℃")
}

// WeatherZhan结构体表示主题(被观察者),维护着一组观察者。
type WeatherZhan struct {
	ObserverList []Observer // 观察者列表
	wd           int        // 温度数据
}

// SendMsg更新WeatherZhan中的温度数据,并调用Notify通知所有观察者。
func (w *WeatherZhan) SendMsg(wd int) {
	w.wd = wd
	w.Notify()
}

// Notify遍历所有的观察者,并调用它们的RevMsg方法来通知他们最新的温度数据。
func (w *WeatherZhan) Notify() {
	for _, observer := range w.ObserverList {
		observer.RevMsg(w.wd)
	}
}

// RegisterObserver将新的观察者添加到WeatherZhan的观察者列表中。
func (w *WeatherZhan) RegisterObserver(observer Observer) {
	w.ObserverList = append(w.ObserverList, observer)
}

func main() {

	// 创建一个新的WeatherZhan实例。
	zhan := WeatherZhan{}

	// 创建两个User实例,代表两个不同的观察者。
	u1 := User{
		Name: "张三",
	}
	u2 := User{
		Name: "李四",
	}

	// 将两个观察者注册到WeatherZhan。
	// 注意这里我们传递的是User实例的指针,因为User的RevMsg方法是指针接收者。
	zhan.RegisterObserver(&u1)
	zhan.RegisterObserver(&u2)

	// 更新WeatherZhan的温度数据,并通过SendMsg通知所有已注册的观察者。
	zhan.SendMsg(8)
}


http://www.kler.cn/a/502086.html

相关文章:

  • fisco bcosV3 Table智能合约开发
  • LeetCode 3270.求出数字答案:每位分别计算 或 for循环
  • 鼠标过滤驱动
  • Unity中对象池的使用(用一个简单粗暴的例子)
  • JavaScript 学习总结
  • 城市生命线安全综合监管平台
  • 抓包之tcpdump安装和使用
  • 数据分析经典案例重现:使用DataWorks Notebook 实现Kaggle竞赛之房价预测,成为数据分析大神!
  • Python机器学习笔记(二十、自动化特征选择)
  • 什么是“负载均衡”?在工作中如何应用?
  • 微软与腾讯技术交锋,TRELLIS引领3D生成领域多格式支持新方向
  • 第二篇:MongoDB 的设计原理
  • Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)
  • 把PX4及子仓库添加到自己的gitee
  • CES 2025|全面拥抱端侧AI,美格智能在CES发布系列创新成果
  • Spring Cloud Alibaba - Nacos理论面试总结-未完结
  • 基于YOLOv8与CGNet的鸟类智能识别系统 深度学习图像分类 鸟类目标检测与分类 图像特征提取 模型优化与应用 数据可视化(源码+指导+定制)
  • WPF中如何在MVVM模式下跨线程更新UI
  • 车载网络:现代汽车的数字心跳
  • CV项目详解:基于yolo8的车辆识别系统(含源码和具体教程)
  • 计算机网络 (39)TCP的运输连接管理
  • 36_Lua中的变量
  • 用 Python 从零开始创建神经网络(二十一):保存和加载模型及其参数
  • 6Hive Sql 大全
  • 网络学习记录5
  • AI代理的分类体系与发展路径:从概念重构到基础设施升级