观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都会自动得到通知并更新。在 Golang 中实现观察者模式可以使用接口和函数来实现。

下面是一个使用 Golang 实现观察者模式的示例代码:

package main

import (
    "fmt"
    "sync"
)

type Observer interface {
    Update(msg string)
}

type Subject struct {
    observers []Observer
    mutex     sync.Mutex
}

func (s *Subject) RegisterObserver(observer Observer) {
    s.mutex.Lock()
    defer s.mutex.Unlock()
    s.observers = append(s.observers, observer)
}

func (s *Subject) RemoveObserver(observer Observer) {
    s.mutex.Lock()
    defer s.mutex.Unlock()
    for i, o := range s.observers {
        if o == observer {
            s.observers = append(s.observers[:i], s.observers[i+1:]...)
            break
        }
    }
}

func (s *Subject) NotifyObservers(msg string) {
    s.mutex.Lock()
    defer s.mutex.Unlock()
    for _, observer := range s.observers {
        observer.Update(msg)
    }
}

type ConcreteObserver1 struct{}

func (o *ConcreteObserver1) Update(msg string) {
    fmt.Println("ConcreteObserver1 received message:", msg)
}

type ConcreteObserver2 struct{}

func (o *ConcreteObserver2) Update(msg string) {
    fmt.Println("ConcreteObserver2 received message:", msg)
}

func main() {
    subject := &Subject{}
    observer1 := &ConcreteObserver1{}
    observer2 := &ConcreteObserver2{}

    subject.RegisterObserver(observer1)
    subject.RegisterObserver(observer2)

    subject.NotifyObservers("Hello World!")

    subject.RemoveObserver(observer2)

    subject.NotifyObservers("Goodbye World!")
}

在上面的代码中,我们定义了一个 Observer 接口,它包含一个 Update 方法,用于接收通知。我们还定义了一个 Subject 结构体,它包含一个 observers 切片用于存储观察者对象,并使用 sync.Mutex 来保证线程安全。

在 Subject 结构体中,我们定义了三个方法:RegisterObserver、RemoveObserver 和 NotifyObservers。RegisterObserver 方法用于注册观察者对象,RemoveObserver 方法用于移除观察者对象,NotifyObservers 方法用于通知所有观察者对象。

接下来,我们定义了两个具体的观察者类:ConcreteObserver1 和 ConcreteObserver2,它们实现了 Observer 接口的 Update 方法,用于接收通知并输出消息。

最后,在 main 函数中,我们创建了一个 Subject 实例和两个观察者实例,并分别调用 RegisterObserver 方法来注册观察者对象。然后,我们调用 NotifyObservers 方法来通知所有观察者对象,并输出相应的消息。接着,我们调用 RemoveObserver 方法来移除一个观察者对象,再次调用 NotifyObservers 方法来

标签: none

添加新评论