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语言中,可以使用Goroutine和通道来实现异步回调。
    首先,定义一个接口类型,并在接口中声明回调方法。例如:
    type Callback interface {
    On...

  • golang闭包函数的作用有哪些

    闭包函数在Go语言中的作用有以下几个: 实现函数柯里化:闭包函数可以将函数的部分参数固定住,返回一个新的函数。这样可以简化函数的使用,方便进行函数组合和代...

  • golang工厂模式怎么实现

    在Golang中,工厂模式可以通过使用接口和结构体来实现。下面是一个简单的例子:
    首先,定义一个接口,表示产品的抽象:
    type Product interface {

  • golang init函数的用法是什么

    在Go语言中,init()函数是一个特殊的函数,用于在包被导入时执行一些初始化操作。init()函数在程序运行时自动被调用,且没有参数和返回值。每个包可以有多个init...

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

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

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

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

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

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

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

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