4

14 观察者模式 -- go语言设计模式

 1 year ago
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.
neoserver,ios ssh client

14 观察者模式 -- go语言设计模式

精选 原创

桃园码工 2023-08-15 20:38:31 博主文章分类:go语言设计模式 ©著作权

文章标签 观察者模式 项目文件 文章分类 Go语言 后端开发 yyds干货盘点 阅读数232

观察者模式也叫做发布-订阅模式。观察者通过通知器(发行商)把自己注册到(订阅)特定的通知(杂志)。当有通知的时候,观察者只从通知器得到它订阅的通知。

观察者模式的实现代码

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()
}
14 观察者模式 -- go语言设计模式_观察者模式

观察者模式的代码拆分

1.项目的准备工作

找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.创建文件夹

//	-- 在项目文件夹 observer_mode 里创建新文件夹

//	observer	-- 存放装饰者的全部文件
14 观察者模式 -- go语言设计模式_项目文件_02

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()
}
14 观察者模式 -- go语言设计模式_项目文件_03

6.全部文件图

14 观察者模式 -- go语言设计模式_观察者模式_04
  • 收藏
  • 评论
  • 分享
  • 举报

Recommend

  • 70

    例子1:class Service:    def __init__(self, service_name, process_name, port, enable_monitor=None):     &n...

  • 50
    • 掘金 juejin.im 6 years ago
    • Cache

    JavaScript设计模式之观察者模式

    嗯~~~ 开门见山,这次我也就不卖关子了,今天我们就来聊一聊 JavasSript 设计模式中的 观察者模式 ,首先我们来认识一下,什么是观察者模式? 什么是观察者模式? 观察者模式(Observer) 通常又被称为 发布-订阅者模式 或 消息机制,它定义了对

  • 32
    • GAD腾讯游戏开发者平台 gad.qq.com 6 years ago
    • Cache

    设计模式之观察者模式(Observer)-腾讯游戏学院

    还是《Game.Programming.Patterns》一书中对观察者模式的个人理解,惯例看一下菜鸟教程的描述:

  • 40

    作者:Andrew Jaffee, 原文链接 ,原文日期:2018-08-06 译者: jojotov ;校对: F...

  • 74

    本文主要对观察者进行概述讲解,并使用观察者模式来模拟海姆达尔在发现敌人来袭后通知雷神托尔和洛基的过程。 一、概念 ...

  • 34

    观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 我们可以使用日常生活中,期刊订阅的例子来形象地解释...

  • 22
    • studygolang.com 4 years ago
    • Cache

    Golang设计模式-观察者模式

    观察者模式 观察者模式定义了对象之间一对多依赖,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。有新类型的观察者出现时,主题的代码不需要修改,主题不在乎别的,他只会发送通知到所有注册并实现了观察者接...

  • 12

    Go设计模式:facade模式和观察者模式 facade模式(外观模式) 初看这个名字,觉得很陌生。但是我说这个模式,其实就是抽象封装,那么我想它就不陌生了。facade模式的作用就是,原本随着项目 变得越来越大,代码之间可能会有一些顺序,如果把...

  • 15
    • rollingstarky.github.io 4 years ago
    • Cache

    Python 设计模式——观察者模式

    Python 设计模式——观察者模式 发表于 2020-12-29 ...

  • 14

    Head First 设计模式 —— 02. 观察者 (Observer) 模式 ...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK