Golang设计模式之观察者模式
来源:互联网 发布:数据库王珊萨第五版pdf 编辑:程序博客网 时间:2024/05/23 12:37
1. 概述
观察者模式简单一句话说就是当特定事件出现时,一个对象实例把事件发布到对应的观察者实例上执行相应的更新操作。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
其类图如下:
具体的代码可示例从github上进行下载。
2. golang具体实现示例
- 首先,定一个事件类型,发生事件驱动时将事件传递给观察者们。这里数据是一个string类型的data, 实际情况可更具需要而定。
type Event struct { Data string}
- 定义观察者和观察对象的接口。Observer定义了一个更新发生事件的标准接口,Subject是具体被观察的接口,他有注册观察者、注销观察者和发布通知的三个主要函数接口。
type Observer interface { //更新事件 Update(*Event)}// 被观察的对象接口type Subject interface { //注册观察者 Regist(Observer) //注销观察者 Deregist(Observer) //通知观察者事件 Notify(*Event)}
- 实现观察者和对象的接口。
type ConcreteObserver struct { Id int}func (co *ConcreteObserver) Update(e *Event) { fmt.Printf("observer [%d] recieved msg: %s.\n", co.Id, e.Data)}type ConcreteSubject struct { Observers map[Observer]struct{}}func (cs *ConcreteSubject) Regist(ob Observer) { cs.Observers[ob] = struct{}{}}func (cs *ConcreteSubject) Deregist(ob Observer) { delete(cs.Observers, ob)}// 通知每个观察者事件func (cs *ConcreteSubject) Notify(e *Event) { for ob, _ := range cs.Observers { ob.Update(e) }}
3. 使用方式
func main() { cs := &ConcreteSubject{ Observers: make(map[Observer]struct{}), } //实例化两个观察者 cobserver1 := &ConcreteObserver{1} cobserver2 := &ConcreteObserver{2} //注册观察者 cs.Regist(cobserver1) cs.Regist(cobserver2) for i := 0; i < 5; i++ { e := &Event{fmt.Sprintf("msg [%d]", i)} cs.Notify(e) time.Sleep(time.Duration(1) * time.Second) }}
阅读全文
0 0
- Golang设计模式之观察者模式
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 《android framework常用api源码分析》之SystemServer进程
- iMobile中三维数据的性能优化
- 机房之注册窗体--存盘
- mybatis_generator自动生成entity、mapper、xml代码
- Android studio 统一管理依赖版本号
- Golang设计模式之观察者模式
- C# FFmpeg相关阅读
- vs2012中的sdf文件出错问题
- 在LaTeX中插入引用
- Geo-Plus.VisionLidar.v28.0.01.33.60.Win64 1CD
- Daum PotPlayer(potplayer播放器)官方正式版V1.7.5545下载 | potplayer 64位
- 使用第三方前端ui框架就是坑,我坚持了7年!
- Mybatis整合SQLite
- 更改checkbox默认样式、radio默认样式,CSS实现自定义