117.info
人生若只如初见

golang观察者模式实现的代码怎么写

在Go语言中实现观察者模式,可以按照以下步骤进行:

  1. 定义主题(Subject)接口,包含以下方法:
type Subject interface {
    Register(observer Observer)    // 注册观察者
    Unregister(observer Observer)  // 取消注册观察者
    Notify()                       // 通知观察者
}
  1. 定义观察者(Observer)接口,包含以下方法:
type Observer interface {
    Update()  // 观察者更新方法
}
  1. 实现主题(Subject)结构体,同时实现Subject接口的方法:
type ConcreteSubject struct {
    observers []Observer
}

func (s *ConcreteSubject) Register(observer Observer) {
    s.observers = append(s.observers, observer)
}

func (s *ConcreteSubject) Unregister(observer Observer) {
    for i, o := range s.observers {
        if o == observer {
            s.observers = append(s.observers[:i], s.observers[i+1:]...)
            break
        }
    }
}

func (s *ConcreteSubject) Notify() {
    for _, observer := range s.observers {
        observer.Update()
    }
}
  1. 实现观察者(Observer)结构体,同时实现Observer接口的方法:
type ConcreteObserver struct {
    name string
}

func (o *ConcreteObserver) Update() {
    fmt.Println(o.name, "received notification")
}
  1. 使用观察者模式:
func main() {
    subject := &ConcreteSubject{}

    observer1 := &ConcreteObserver{name: "Observer 1"}
    observer2 := &ConcreteObserver{name: "Observer 2"}

    subject.Register(observer1)
    subject.Register(observer2)

    subject.Notify()

    subject.Unregister(observer1)

    subject.Notify()
}

在上述代码中,ConcreteSubject实现了Subject接口,ConcreteObserver实现了Observer接口。当Subject的状态发生变化时,通过调用Notify方法通知所有注册的观察者进行更新。在main函数中,我们创建了一个ConcreteSubject对象,并注册了两个ConcreteObserver对象。然后通过调用Notify方法通知所有观察者进行更新。最后,我们取消注册了observer1,并再次调用Notify方法,此时只有observer2会收到通知。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fecbaAzsLBQFQDFw.html

推荐文章

  • golang底层是什么语言

    Go语言(也称为Golang)的底层主要是由C语言编写的,并且在后续的版本中,Go语言完成了语言自举,即使用Go语言自身来编写编译器。这使得Go语言的编译器和运行时环...

  • golang协程和线程的区别有哪些

    Golang协程(Goroutine)和线程的区别主要体现在以下几个方面: 轻量级:Golang的协程是由Golang运行时管理的,相较于操作系统级的线程,协程更轻量级,启动和销...

  • golang动态生成struct的方法是什么

    在Go语言中,可以使用reflect包来动态生成struct。下面是一个示例代码:
    package main
    import (
    "fmt"
    "reflect"
    )
    type Person ...

  • golang怎么爬取动态内容

    要爬取动态内容,你可以使用以下几种方法:1. 使用headless浏览器:可以使用一些基于Chrome或Firefox的headless浏览器库,如Puppeteer或Selenium。这些库可以模拟...

  • golang协程调度的原理是什么

    Golang的协程调度器的原理是基于M:N的模型。其中M代表操作系统的线程(Machine),N代表Golang的协程(Goroutine)。
    Golang的调度器维护了一个全局的运行队...

  • python并发执行函数怎么实现

    在Python中,可以使用多线程或者多进程来实现并发执行函数的效果。
    使用多线程实现并发执行函数:
    import threading def func1(): # 函数1的实现代码 ...

  • Java类对象封装的方法是什么

    Java类对象封装的方法是通过定义类、属性和方法来封装数据和行为。类是一种模板或蓝图,用于创建具有相似属性和行为的对象。属性是类的成员变量,用于存储对象的...

  • c++互斥锁的用法是什么

    在C++中,互斥锁(Mutex)用于保护共享资源,防止多个线程同时访问该资源,从而避免数据竞争和并发问题。互斥锁的用法包括以下几个步骤: 包含头文件:首先需要包...