首先了解一下观察者模式

1.目标和观察者抽象对象需要首先建立

 //抽象主题
type Subject interface {
Add(o Observer)
Send(str string)
} //抽象观察者
type Observer interface {
Receive(str string)
}

2.主题的具体实现

 //-------------天气主题------------------
type NewsSubject struct {
title string
l *list.List
} //天气主题非侵入式实现抽象主题
func (sub *NewsSubject) Add(o Observer) {
sub.l.PushBack(o)
} //天气主题非侵入式实现抽象主题
func (sub *NewsSubject) Send(str string) {
for i := sub.l.Front(); i != nil; i = i.Next() {
(i.Value).(Observer).Receive(sub.title + "发送的:" + str)
}
} //-------------热点主题------------------
type HotSubject struct {
title string
l *list.List
} //热点主题非侵入式实现抽象主题
func (sub *HotSubject) Add(o Observer) {
sub.l.PushBack(o)
} //热点主题非侵入式实现抽象主题
func (sub *HotSubject) Send(str string) {
for i := sub.l.Front(); i != nil; i = i.Next() {
(i.Value).(Observer).Receive(sub.title + "发送的:" + str)
}
}

3.观察者具体实现

 //-------------a观察者------------------
type aObserver struct {
name string
} //a观察者非侵入式实现抽象观察者
func (o *aObserver) Receive(str string) {
fmt.Println("A类观察者【" + o.name + "】接收" + str)
} //-------------b观察者------------------
type bObserver struct {
name string
} //b观察者非侵入式实现抽象观察者
func (o *bObserver) Receive(str string) {
fmt.Println("B类观察者【" + o.name + "】接收" + str)
}

4.实际调用

 func main() {
a := &aObserver{
name: "张三",
} b := &bObserver{
name: "李四",
} //新闻允许a和b类型观察者订阅
news := NewsSubject{
l: list.New(),
title: "武汉新闻",
}
news.Add(a)
news.Add(b) //热点只允许b类型观察者订阅
hot := HotSubject{
l: list.New(),
title: "孝感热点",
}
hot.Add(b) news.Send("全省暴雨红色警报")
hot.Send("全市停工停课")
}

5.运行结果

学习Go语言之观察者模式的更多相关文章

  1. 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗

    文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...

  2. 开始学习c语言

    学习c语言的第一篇博客,心里的感觉说不出来,不知道能不能坚持下去,我是一名工作了差不多2年的phper,其实我本来是想学习数据结构和算法的,但是尼玛这年头那些书的例子都不是php,动不动就是c,jav ...

  3. 学习C语言感悟

     还记得刚上第一节C语言课的时候,基本上一节课只有最后10分钟的内容听懂了.在此之前从没接触过C语言,想说看看书预习一下吧,可是完全找不到条理,发现老师也不是按书上的顺序讲的.当时就特别着急,想说难道 ...

  4. 学习Nim语言.rar(nim语言中文教程下载)

    学习Nim语言 nim 语法上类似python ,是一门静态编译型语言,nim 使用空格缩进标示语句块的开始和结束, 喜欢python风格的程序员应该也会很容易适应和喜欢nim的风格. nim语言官方 ...

  5. 学习C语言常用的几个网站

    今天整理资料,发现了以前学习C语言时,常用到的几个网站: 1.http://ganquan.info/standard-c/   改网站包含了C语言标准版的15个头文件解释以及函数,137个函数和演示 ...

  6. 对大一新生开始学习C语言课程谈几点看法

    大家好,首先祝贺大家进入了大学,迈入了大学的校门,也意味着开始了新的征程,希望大家能够有一个美好的大学四年. 先做下自我介绍,我叫李帅阳,(大家可以称呼我 李老师,或是班助,或是...)这是在邹欣老师 ...

  7. 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)

    前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...

  8. 新学习的语言Groovy

    什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...

  9. 转:从开源项目学习 C 语言基本的编码规则

    从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项 ...

随机推荐

  1. window如何在命令行关掉端口

    欢迎加入前端交流群来py:749539640   进入cmd netstat -ano | findstr :yourPortNumber taskkill /PID typeyourPIDhere ...

  2. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告

    题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...

  3. 07:清泉-改(prime+堆)

    时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  512000kB 描述 华北电力大学可以抽象为一张有n个点m条边的无向图. 现在所有的边都断了. 修复每条边都有个不同 ...

  4. 如何设置ASP.NET站点页面运行超时

    全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值.Machine.config 文件位于 % ...

  5. ActiveMQ学习笔记(7)----ActiveMQ支持的传输协议

    1. 连接到ActiveMQ Connector: Active提供的,用来实现连接通讯的功能,包括:client-to-broker,broker-to-broker.ActiveMQ允许客户端使用 ...

  6. SpringBoot学习笔记(11)-----SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

    1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId& ...

  7. 数据库应用_innobackupex备份与恢复

    1.Percona软件介绍; 2.innobackupex的备份与恢复 一, Percona软件 在学习percona软件之前,我们看一下物理备份和mysqldump备份有哪些缺陷. 物理备份的缺点: ...

  8. (转)Java 虚拟机体系结构

    来源:http://hxraid.iteye.com/blog/676235 众所周知,Java源代码被编译器编译成class文件.而并不是底层操作系统可以直接执行的二进制指令(比如Windows O ...

  9. python学习笔记第三章

    1.列表是由一系列特定顺序排列得元素组成,在python中用([])组成,列表得索引是从0开始,不是1 xu=['a','b',''c] print(xu) 访问列表的元素第一个元素 xu=['a', ...

  10. How Javascript works (Javascript工作原理) (七) WebAssembly 对比 JavaScript 及其使用场景

    个人总结: 1.webworkers实现了用多线程浏览器来进行多线程操作js的能力. 2.web workers不能操作dom,window,document等对象,一般用于cpu计算型的任务.   ...