首先了解一下观察者模式

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

  1. //抽象主题
  2. type Subject interface {
  3. Add(o Observer)
  4. Send(str string)
  5. }
  6.  
  7. //抽象观察者
  8. type Observer interface {
  9. Receive(str string)
  10. }

2.主题的具体实现

  1. //-------------天气主题------------------
  2. type NewsSubject struct {
  3. title string
  4. l *list.List
  5. }
  6.  
  7. //天气主题非侵入式实现抽象主题
  8. func (sub *NewsSubject) Add(o Observer) {
  9. sub.l.PushBack(o)
  10. }
  11.  
  12. //天气主题非侵入式实现抽象主题
  13. func (sub *NewsSubject) Send(str string) {
  14. for i := sub.l.Front(); i != nil; i = i.Next() {
  15. (i.Value).(Observer).Receive(sub.title + "发送的:" + str)
  16. }
  17. }
  18.  
  19. //-------------热点主题------------------
  20. type HotSubject struct {
  21. title string
  22. l *list.List
  23. }
  24.  
  25. //热点主题非侵入式实现抽象主题
  26. func (sub *HotSubject) Add(o Observer) {
  27. sub.l.PushBack(o)
  28. }
  29.  
  30. //热点主题非侵入式实现抽象主题
  31. func (sub *HotSubject) Send(str string) {
  32. for i := sub.l.Front(); i != nil; i = i.Next() {
  33. (i.Value).(Observer).Receive(sub.title + "发送的:" + str)
  34. }
  35. }

3.观察者具体实现

  1. //-------------a观察者------------------
  2. type aObserver struct {
  3. name string
  4. }
  5.  
  6. //a观察者非侵入式实现抽象观察者
  7. func (o *aObserver) Receive(str string) {
  8. fmt.Println("A类观察者【" + o.name + "】接收" + str)
  9. }
  10.  
  11. //-------------b观察者------------------
  12. type bObserver struct {
  13. name string
  14. }
  15.  
  16. //b观察者非侵入式实现抽象观察者
  17. func (o *bObserver) Receive(str string) {
  18. fmt.Println("B类观察者【" + o.name + "】接收" + str)
  19. }

4.实际调用

  1. func main() {
  2. a := &aObserver{
  3. name: "张三",
  4. }
  5.  
  6. b := &bObserver{
  7. name: "李四",
  8. }
  9.  
  10. //新闻允许a和b类型观察者订阅
  11. news := NewsSubject{
  12. l: list.New(),
  13. title: "武汉新闻",
  14. }
  15. news.Add(a)
  16. news.Add(b)
  17.  
  18. //热点只允许b类型观察者订阅
  19. hot := HotSubject{
  20. l: list.New(),
  21. title: "孝感热点",
  22. }
  23. hot.Add(b)
  24.  
  25. news.Send("全省暴雨红色警报")
  26. hot.Send("全市停工停课")
  27. }

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. Ubuntu下使用Deepin-wine的移植版安装qq微信等

    title: Ubuntu下使用Deepin-wine的移植版安装qq微信等 toc: false date: 2018-09-18 16:12:49 categories: methods tags ...

  2. python的import与from…import的区别

    [转]http://blog.csdn.net/windone0109/article/details/8996184 在python中用import或者from-import来导入相应的模块.模块其 ...

  3. 网页字体助手 WebFont Helper

    网页字体助手 是 Windows 平台离线的网页字体生成辅助工具.核心功能,采用 python 编写. WebFont Helper 功能特色 生成字体子集(即提取用到的字符生成字体,或者大家所说的字 ...

  4. JS常用框架及各自特点

    JavaScript 是面向对象的脚本语言,长期以来用作 Web 浏览器应用程序的客户端脚本接口React:起源于Facebook,并与2013年开源,是一个用于构建用户界面(主要是UI)的JavaS ...

  5. Oracle查询当前用户下的所有表及sqlplus 设置 列宽

    如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密码@IP地址/数据库名称. [oracle@ ...

  6. ZBrush软件特性之Material

    在ZBrush中,任何物体表面的外观都是多种因素的综合结果,例如基础颜色.纹理图像投落到表面上的照明效果和材质属性.材质可以改变照明在表面上的反应,以便模型表现出光泽.凹凸.反射.金属性或透明效果.Z ...

  7. python中*号用法总结

    python 中有很多地方用到星号,有时候会想知道这个*是干嘛用的,总结如下,有不当之处,还望不吝指出,谢谢.1.乘法: 在很多时候是用作乘法的,例如: In [90]: 2*7 Out[90]: 1 ...

  8. Vue 中 换行符获取

    当要获取到 vue 中 文本域的换行符时, 需要用到正则匹配. let reg = new RegExp('/n',"g"); let str = text.replace(reg ...

  9. [USACO10FEB]吃巧克力Chocolate Eating

    题目:洛谷P2985. 题目大意:有n块巧克力要吃d天,并且只能按顺序吃.一块巧克力有一个开心值,吃了就能增加开心值.一个人初始开心值为0,且每天早上开心值变为原来的一半.问如何吃巧克力才能使开心值最 ...

  10. C++ vector基本用法

    转自金河http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html 1 基本操作 (1)头文件#include<vector> ...