模式定义

定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新

类图

应用场景

当更改一个对象的状态可能需要更改其他对象,并且实际的对象事先未知或动态更改时,使用观察者模式

优点

1.符合开闭原则

2.可以在运行时建立对象之间的关系

要点总结

  • 使用面向对象的抽象,Observe模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合
  • 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播
  • 观察者自己解决是否需要订阅通知,目标对象对此一无所知
  • Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分

Go语言代码实现

工程目录

observe.go

package Observerimport ("fmt""sync""time"
)type Event struct {Data int
}type Observer interface {NotifyCallback(event Event)
}type Subject interface {AddListener(observer Observer)RemoveListener(observer Observer)Notify(event Event)
}type eventObserver struct {ID   intTime time.Time
}type eventSubject struct {Observers sync.Map
}func (e eventObserver) NotifyCallback(event Event) {fmt.Printf("Recieved:%d after %v\n", event.Data, time.Since(e.Time))
}func (e *eventSubject) AddListener(obs Observer) {e.Observers.Store(obs, struct{}{})
}func (e *eventSubject) RemoveListener(obs Observer) {e.Observers.Delete(obs)
}func (e *eventSubject) Notify(event Event) {e.Observers.Range(func(key, value interface{}) bool {if key == nil {return false}key.(Observer).NotifyCallback(event)return true})
}func Fib(n int) chan int {out := make(chan int)go func() {defer close(out)for i, j := 0, 1; i < n; i, j = i+j, i {out <- i}}()return out
}

observer_test.go

package Observerimport ("sync""testing""time"
)func TestFib(t *testing.T) {//for x := range Fib(10) {// fmt.Println(x)//}n := eventSubject{Observers: sync.Map{}}obs1 := eventObserver{ID: 1, Time: time.Now()}obs2 := eventObserver{ID: 2, Time: time.Now()}n.AddListener(obs1)n.AddListener(obs2)for x := range Fib(10) {n.Notify(Event{Data: x})}
}

设计模式--观察者(Observer)模式相关推荐

  1. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  2. 移动项目开发笔记(.Net下的观察者(Observer)模式)

    下面是一些关于这个Observer的基本一些概念,在很多地方都能看到,这里我归纳这这里便于以后查阅: 一.发布订阅模型(pub-sub) 二.动机(Motivation) 在软件构建过程中,我们需要为 ...

  3. Java 设计模式之 Observer 模式

    Java 设计模式中相对容易理解的一种模式,生活中也很容易举出很多例子, 这种设计模式的应用场景为:Subject 被观察者发出某事件,通知观察者 Observer,观察者根据事件 Event 作出响 ...

  4. 我的实用设计模式之Observer模式

    写这篇文章主要想总结自己的工作经验,温故而知新.为什么叫做实用设计模式,所谓的实用模式就是说这些模式在本人的实际工作中使用过的,而且本人相对熟悉的,经验认为这些模式的使用能给系统带来有效改善.这些模式 ...

  5. Java设计模式之观察者Observer模式代码示例

  6. 设计模式-Observer模式

    目录 角色组成 抽象主题(Subject) 具体主题(Concrete Subject) 抽象观察者(Observer) 具体观察者(Concrete Observer) 具体实现 总结 观察者模式( ...

  7. 设计模式---组件协作模式之观察者模式(Observer)

    一:概念 Observer模式的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态 Observer模式提供给关联对象一种同步通信的手段,使得某个对象与依赖他的其他对象之间保 ...

  8. 设计模式-05.01-行为型-观察者模板模式

    文章目录 观察者模式[常用] Demo案例-天气预报 方案一 WeatherData CurrentConditions Client 问题分析 观察者模式方案 Subject[接口] Observe ...

  9. 设计模式-行为型模式-Observer 观察者模式

    设计模式-行为型模式-Observer 观察者模式 1.简介 软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的: 观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对 ...

最新文章

  1. pytorch 数据加载为python提供了cpu全速跑跑其他任务的能力
  2. 央视在世界杯高清直播中占了C位 它是怎么做到的?
  3. 怎么删除结构体数组中的一组数据_数据结构-栈
  4. Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
  5. Java2Days 2012:Java EE
  6. c语言20152016真题及答案,2016年计算机二级《C语言》基础练习题及答案(15)
  7. python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根
  8. Reading HTML content from a UIWebView
  9. 计算机网络各层设备及作用
  10. esp32 Flash分区与OTA功能简析
  11. WPF异常:调用线程无法访问此对象,因为另一个线程拥有该对象。
  12. JS中数组(Array)、Json对象长度(length)获取方法
  13. JS — 声明与引入
  14. vr 计算机配置,能玩VR的电脑装机 | 装机配置分享_什么值得买
  15. Adams调用cffsub求解动力学仿真过程中的摩擦力
  16. 【论文阅读】24-USAC: A Universal Framework for Random Sample Consensus
  17. JavaScript函数补完:sort()排序
  18. 中国移动清退3G进行时
  19. 盘点十大机器人公众号
  20. 树莓派4B使用create_ap做无线热点(AP)

热门文章

  1. 你了解机房保温棉的使用和作用吗?
  2. linux磁盘响应慢,arch开机速度竟然是挂载磁盘拖慢了。。
  3. mysql严格模式 报错_代码一上传服务器就报错-尝试开启 MySQL 严格模式
  4. ad软件 pcb如何走线过孔_【经验】关于高速PCB设计的一些经典问答
  5. Paper之IEEERSJ:2009年~2019年机器人技术(IEEE机器人和自动化国际会议RSJ智能机器人与系统国际会议机器人技术:科学与系统机器人学报)历年最佳论文简介及其解读
  6. Paper:2020年3月30日何恺明团队最新算法RegNet—来自Facebook AI研究院《Designing Network Design Spaces》的翻译与解读
  7. Crawler:基于BeautifulSoup库+requests库+伪装浏览器的方式实现爬取14年所有的福彩网页的福彩3D相关信息,并将其保存到Excel表格中
  8. Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内
  9. SSRS动态设置文本框属性
  10. 接口与继承动手动脑整理