

14 观察者模式 -- go语言设计模式
source link: https://blog.51cto.com/u_14483476/7093633
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

14 观察者模式 -- go语言设计模式
精选 原创观察者模式也叫做发布-订阅模式。观察者通过通知器(发行商)把自己注册到(订阅)特定的通知(杂志)。当有通知的时候,观察者只从通知器得到它订阅的通知。
观察者模式的实现代码
package main
import "fmt"
//--------- 抽象层 --------
//抽象的观察者
type Listener interface {
OnTeacherComming() //观察者得到通知后要触发的动作
}
type Notifier interface {
AddListener(listener Listener)
RemoveListener(listener Listener)
Notify()
}
//--------- 实现层 --------
//观察者学生
type StuZhang3 struct {
Badthing string
}
func (s *StuZhang3) OnTeacherComming() {
fmt.Println("张3 停止 ", s.Badthing)
}
func (s *StuZhang3) DoBadthing() {
fmt.Println("张3 正在", s.Badthing)
}
type StuZhao4 struct {
Badthing string
}
func (s *StuZhao4) OnTeacherComming() {
fmt.Println("赵4 停止 ", s.Badthing)
}
func (s *StuZhao4) DoBadthing() {
fmt.Println("赵4 正在", s.Badthing)
}
type StuWang5 struct {
Badthing string
}
func (s *StuWang5) OnTeacherComming() {
fmt.Println("王5 停止 ", s.Badthing)
}
func (s *StuWang5) DoBadthing() {
fmt.Println("王5 正在", s.Badthing)
}
//通知者班长
type ClassMonitor struct {
listenerList []Listener //需要通知的全部观察者集合
}
func (m *ClassMonitor) AddListener(listener Listener) {
m.listenerList = append(m.listenerList, listener)
}
func (m *ClassMonitor) RemoveListener(listener Listener) {
for index, l := range m.listenerList {
//找到要删除的元素位置
if listener == l {
//将删除的点前后的元素链接起来
m.listenerList = append(m.listenerList[:index], m.listenerList[index+1:]...)
break
}
}
}
func (m* ClassMonitor) Notify() {
for _, listener := range m.listenerList {
//依次调用全部观察的具体动作
listener.OnTeacherComming()
}
}
func main() {
s1 := &StuZhang3{
Badthing: "抄作业",
}
s2 := &StuZhao4{
Badthing: "玩王者荣耀",
}
s3 := &StuWang5{
Badthing: "看赵四玩王者荣耀",
}
classMonitor := new(ClassMonitor)
fmt.Println("上课了,但是老师没有来,学生们都在忙自己的事...")
s1.DoBadthing()
s2.DoBadthing()
s3.DoBadthing()
classMonitor.AddListener(s1)
classMonitor.AddListener(s2)
classMonitor.AddListener(s3)
fmt.Println("这时候老师来了,班长给学什么使了一个眼神...")
classMonitor.Notify()
}

观察者模式的代码拆分
1.项目的准备工作
找到 go 的 GOPATH
$ go env //可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
2.创建文件夹
// -- 在项目文件夹 observer_mode 里创建新文件夹
// observer -- 存放装饰者的全部文件

3.接口文件 – observer文件夹
文件1 – listener.go
package observer
//抽象的观察者
type Listener interface {
OnTeacherComming() //观察者得到通知后要触发的动作
}
文件2 – notifier.go
package observer
// 抽象通知人
type Notifier interface {
AddListener(listener Listener)
RemoveListener(listener Listener)
Notify()
}
4.结构体文件 – observer文件夹
文件1 – stuzhang3.go
package observer
import "fmt"
//观察者学生
type StuZhang3 struct {
Badthing string
}
func (s *StuZhang3) OnTeacherComming() {
fmt.Println("张3 停止 ", s.Badthing)
}
func (s *StuZhang3) DoBadthing() {
fmt.Println("张3 正在", s.Badthing)
}
文件2 – zhao4.go
package observer
import "fmt"
//观察者学生
type StuZhao4 struct {
Badthing string
}
func (s *StuZhao4) OnTeacherComming() {
fmt.Println("赵4 停止 ", s.Badthing)
}
func (s *StuZhao4) DoBadthing() {
fmt.Println("赵4 正在", s.Badthing)
}
文件3 – stuwang5.go
package observer
import "fmt"
//观察者学生
type StuWang5 struct {
Badthing string
}
func (s *StuWang5) OnTeacherComming() {
fmt.Println("王5 停止 ", s.Badthing)
}
func (s *StuWang5) DoBadthing() {
fmt.Println("王5 正在", s.Badthing)
}
文件4 – classmonitor.go
package observer
//通知者班长
type ClassMonitor struct {
listenerList []Listener //需要通知的全部观察者集合
}
func (m *ClassMonitor) AddListener(listener Listener) {
m.listenerList = append(m.listenerList, listener)
}
func (m *ClassMonitor) RemoveListener(listener Listener) {
for index, l := range m.listenerList {
//找到要删除的元素位置
if listener == l {
//将删除的点前后的元素链接起来
m.listenerList = append(m.listenerList[:index], m.listenerList[index+1:]...)
break
}
}
}
func (m* ClassMonitor) Notify() {
for _, listener := range m.listenerList {
//依次调用全部观察的具体动作
listener.OnTeacherComming()
}
}
5.主文件 – main.go 在项目文件夹
package main
import (
"design/observer_mode/observer"
"fmt"
)
func main() {
s1 := &(observer.StuZhang3{
Badthing: "抄作业",
})
s2 := &(observer.StuZhao4{
Badthing: "玩王者荣耀",
})
s3 := &observer.StuWang5{
Badthing: "看赵四玩王者荣耀",
}
classMonitor := new(observer.ClassMonitor)
fmt.Println("上课了,但是老师没有来,学生们都在忙自己的事...")
s1.DoBadthing()
s2.DoBadthing()
s3.DoBadthing()
classMonitor.AddListener(s1)
classMonitor.AddListener(s2)
classMonitor.AddListener(s3)
fmt.Println("这时候老师来了,班长给学什么使了一个眼神...")
classMonitor.Notify()
}

6.全部文件图

- 赞
- 收藏
- 评论
- 分享
- 举报
Recommend
-
70
例子1:class Service: def __init__(self, service_name, process_name, port, enable_monitor=None): &n...
-
50
嗯~~~ 开门见山,这次我也就不卖关子了,今天我们就来聊一聊 JavasSript 设计模式中的 观察者模式 ,首先我们来认识一下,什么是观察者模式? 什么是观察者模式? 观察者模式(Observer) 通常又被称为 发布-订阅者模式 或 消息机制,它定义了对
-
32
还是《Game.Programming.Patterns》一书中对观察者模式的个人理解,惯例看一下菜鸟教程的描述:
-
40
作者:Andrew Jaffee, 原文链接 ,原文日期:2018-08-06 译者: jojotov ;校对: F...
-
74
本文主要对观察者进行概述讲解,并使用观察者模式来模拟海姆达尔在发现敌人来袭后通知雷神托尔和洛基的过程。 一、概念 ...
-
34
观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 我们可以使用日常生活中,期刊订阅的例子来形象地解释...
-
22
观察者模式 观察者模式定义了对象之间一对多依赖,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。有新类型的观察者出现时,主题的代码不需要修改,主题不在乎别的,他只会发送通知到所有注册并实现了观察者接...
-
12
Go设计模式:facade模式和观察者模式 facade模式(外观模式) 初看这个名字,觉得很陌生。但是我说这个模式,其实就是抽象封装,那么我想它就不陌生了。facade模式的作用就是,原本随着项目 变得越来越大,代码之间可能会有一些顺序,如果把...
-
15
Python 设计模式——观察者模式 发表于 2020-12-29 ...
-
14
Head First 设计模式 —— 02. 观察者 (Observer) 模式 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK