go语言设计模式之observer
observer.go
package observer import ( "fmt" ) type Observer interface { Notify(string) } type Publisher struct { ObserversList []Observer } func (s *Publisher) AddObserver(o Observer) { s.ObserversList = append(s.ObserversList, o) } func (s *Publisher) RemoveObserver(o Observer) { var indexToRemove int for i, observer := range s.ObserversList { if observer == o { indexToRemove = i break } } s.ObserversList = append(s.ObserversList[:indexToRemove], s.ObserversList[indexToRemove+1:]...) } func (s *Publisher) NotifyObservers(m string) { fmt.Printf("Publisher received message '%s' to notify observers\n", m) for _, observer := range s.ObserversList { observer.Notify(m) } }
observer_test.go
package observer import ( "fmt" "testing" ) type TestObserver struct { ID int Message string } func (p *TestObserver) Notify(m string) { fmt.Printf("Observer %d: message '%s' received \n", p.ID, m) p.Message = m } func TestSubject(t *testing.T) { testObserver1 := &TestObserver{1, ""} testObserver2 := &TestObserver{2, ""} testObserver3 := &TestObserver{3, ""} publisher := Publisher{} t.Run("AddObserver", func(t *testing.T) { publisher.AddObserver(testObserver1) publisher.AddObserver(testObserver2) publisher.AddObserver(testObserver3) if len(publisher.ObserversList) != 3 { t.Fail() } }) t.Run("RemoveObserver", func(t *testing.T) { publisher.RemoveObserver(testObserver2) fmt.Println(publisher.ObserversList) if len(publisher.ObserversList) != 2 { t.Error("The size of the observer list is not 2.") } for _, observer := range publisher.ObserversList { testObserver, ok := observer.(*TestObserver) if !ok { t.Fail() } if testObserver.ID == 2 { t.Fail() } } }) t.Run("Notify", func(t *testing.T) { for _, observer := range publisher.ObserversList { printObserver, ok := observer.(*TestObserver) if !ok { t.Fail() break } if printObserver.Message != "" { t.Error("The observer's Message field weren't empty.") } } message := "Hello World" publisher.NotifyObservers(message) for _, observer := range publisher.ObserversList { printObserver, ok := observer.(*TestObserver) if !ok { t.Fail() break } if printObserver.Message != message { t.Errorf("Expected message on observer %d was "+ "not expected: '%s' != '%s'\n", printObserver.ID, printObserver.Message, message) } } }) }
go语言设计模式之observer的更多相关文章
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- C语言设计模式
一 .C语言和设计模式(继承.封装.多态) C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
- [置顶] head first 设计模式之----Observer pattern
浅谈设计模式之----观察者模式 观察者模式也是我们日常程序编写中碰到比较多的一种设计模式.首先,所谓观察者模式定义就是指:在对象之间定义了一对多的依赖,这样一来,当一个对象的状态发生变化的 ...
- 设计模式之“Observer”注疏#01
原文首发于我的微信公众号:GeekArtT. Observer设计模式是为了解决"信息同步更新"的问题而存在的.它试图解决这样一个问题:如果有"一堆对象"都跟随 ...
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 设计模式--观察者模式Observer(对象行为型)
一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...
随机推荐
- 2019年创意可爱卡通小清新教育课件培训PPT模板
模版来源:http://ppt.dede58.com/jiaoxuekejian/26791.html
- Java源码记录 - AbstractMap
路径java.util.AbstractMap ()构造方法 /** * 唯一的构造器.(一般由子类隐式调用) */ protexted AbstractMap(){ } size()返回当前map的 ...
- GitLab基本设置-新增用户
场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- 松软科技web课堂:JavaScript Math 对象
JavaScript Math 对象允许您对数字执行数学任务. 实例 Math.PI; // 返回 3.141592653589793 Math.round() Math.round(x) 的返回值是 ...
- 在服务器的tomcat中部署手机apk项目,浏览器或手机下载不能根据URL下载和安装apk文件
Android的APK包不能下载或安装,需在tomcat的web.xml加入 <mime-mapping> <extension>apk</extensio ...
- RabbitMQ Win10安装
RabbitMQ是消息对列,主要是用于做消息代理.本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间, 它可以根据你给它的路由,缓冲规则有选择地进行传递消息.采用Erlang语言开 ...
- C语言入门-枚举
常量符号化 用符号而不是具体的数字来表示程序中的数字 一. 枚举 用枚举而不是定义独立的const int变量 枚举是一种用户定义的数据类型,它用关键字enum如以下语句来声明 enum 枚举类型名字 ...
- Data Guard:Oracle 12c –新增和更新的功能 (Doc ID 1558256.1)
Data Guard: Oracle 12c – New and updated Features (Doc ID 1558256.1) APPLIES TO: Oracle Database - E ...
- openstack-neutron安装与配置
一.实验目的: 1.理解neutron服务在OpenStack中的作用 2.掌握在控制节点上安装配置neutron的方法和步骤 3.掌握在计算节点上安装与配置neutron的方法和步骤 二.实验步骤: ...
- IDEA中写MyBatis的xml配置文件编译报错的坑
IDEA中写MyBatis的xml配置文件编译报错的坑 说明:用IDEA编译工具在项目中使用Mybatis框架,编写mybatis-config.xml和Mapper.xml配置文件时,编译项目出现错 ...