当前位置: 首页 > news >正文

《golang设计模式》第三部分·行为型模式-07-观察者模式(Observer)/发布者—订阅者模式

文章目录

  • 1. 概念
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 代码
    • 2.2 类图

1. 概念

观察者(Observer)指当目标对象状态发生变化后,对状态变化事件进行响应或处理的对象。

1.1 角色

  • Subject(抽象主题):
    • 它可以有多个观察者,并将所有观察者对象的引用保存在一个集合里
    • 被观察者提供一个接口,可以增加和删除观察者角色
  • ConcreteSubject(具体主题):
    • 将有关状态存入具体观察者对象
    • 在主题发生改变时,给所有的观察者发出通知
  • Observer(抽象观察者):
    • 为所有的具体观察者定义一个更新接口,在收到主题的通知时能够及时的更新自己
  • ConcreteObserver(具体观察者):
    • 实现抽象观察者角色定义的更新接口,以便使本身的状态与主题状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

1.2 类图

Subject
-observer:List
+Add(o:Observer)
+NotifyObserver()
+ChangeState()
ConcreteSubject
+ChangeState()
«interface»
Observer
+Update(s:State)
ConcreteObserverA
+Update(s:State)
ConcreteObserverB
+Update(s:State)

2. 代码示例

2.1 代码

  • 代码
package mainimport "fmt"//定义抽象主题,它是观察者的聚合
type Subject struct{  observers []Observer
}//定义一个方法,为抽象主题添加观察者
func (c *Subject) Attach(o ...Observer) {c.observers = append(c.observers, o...)
}//定义实际主题,继承抽象主题,它是实际的被观察者。
type ConcreteSubject struct {Subject    Subjectcontext   string}//依次通知观察者
func (c *ConcreteSubject) notify() {for _, o := range c.Subject.observers {o.Update(c)}}//具体抽象主题的,同时发送通知给观察者
func (c *ConcreteSubject) UpdateContext(context string) {c.context = contextc.notify()
}//定义抽象观察者
type Observer interface {Update(*ConcreteSubject)
}//定义具体观察者
type ConcreteObserverA struct {name string
}//更新观察者
func (r *ConcreteObserverA) Update(c *ConcreteSubject) {fmt.Printf("%s receive %q\n", r.name, c.context)
} //定义具体观察者
type ConcreteObserverB struct {name string
}//更新观察者
func (r *ConcreteObserverB) Update(c *ConcreteSubject) {fmt.Printf("%s receive %q\n", r.name, c.context)
} //定义具体观察者
type ConcreteObserverC struct {name string
}//更新观察者
func (r *ConcreteObserverC) Update(c *ConcreteSubject) {fmt.Printf("%s receive %q\n", r.name, c.context)
} func main() {//实例化抽象主题subject := Subject{observers: make([]Observer, 0),}//实例化3观察者concreteObserverA := &ConcreteObserverA{name: "concreteObserverA",}concreteObserverB := &ConcreteObserverB{name: "concreteObserverB",}concreteObserverC := &ConcreteObserverC{name: "concreteObserverC",}//将3个观察者加入抽象主题subject.Attach(concreteObserverA,concreteObserverB,concreteObserverC)//实例化具体主题concreteSubject := &ConcreteSubject{Subject: subject,}//更新具体主题,它将通知所有观察者concreteSubject.UpdateContext("updata context")
}
  • 输出
concreteObserverA receive "updata context"
concreteObserverB receive "updata context"
concreteObserverC receive "updata context"

2.2 类图

Subject
+[]Observe observers
+Attach(o ...Observer)
ConcreteSubject
+Subject:Subject
+context:String
+Notify()
+UpdateContext(context string)
«interface»
Observer
+Update(c *ConcreteSubject)
ConcreteObserverA
+Name:String
+Update(c *ConcreteSubject)
ConcreteObserverB
+Name:String
+Update(c *ConcreteSubject)
ConcreteObserverC
+Name:String
+Update(c *ConcreteSubject)
http://www.lryc.cn/news/240937.html

相关文章:

  • Maven中常用命令以及idea中使用maven指南
  • 深度学习之八(生成对抗网络--Generative Adversarial Networks,GANs)
  • 内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识
  • Linux python安装 虚拟环境 virtualenv
  • 洛谷 P1883 函数
  • 【C++心愿便利店】No.14---C++之探索list底层原理
  • 【广州华锐互动】VR防溺水安全内容体验提高群众防溺水意识
  • 【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块
  • python内置模块binascii,二进制数据和ASCII字符串之间进行转换
  • 如何开启MySQL的慢查询日志
  • Spine的BoundingBoxAttachment碰撞检测
  • Proteus下仿真AT89C51报“串行口通信失败,请检查电平适配是否正确。”解决办法
  • 微信小程序制作
  • 快速在WIN11中本地部署chatGLM3
  • 土地利用数据技术服务
  • qml动画过渡Transition
  • Django(九、cookie与session)
  • web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon
  • 使用 goland 开发 golang 项目环境配置
  • Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问
  • [git] 忽略已经提交的文件或文件夹
  • 大模型增量预训练参数说明
  • 成为AI产品经理——模型评估概述
  • 内存屏障与JVM指令
  • 深入理解JVM 类加载机制
  • SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡
  • SpringSecurity+JWT权限认证
  • Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式
  • 安全框架springSecurity+Jwt+Vue-2(后端开发)
  • 6.1.webrc媒体协商