观察者模式(Observer Pattern)

未匹配的标注

观察者模式(Observer Pattern)是一种设计模式,它定义了对象间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都可以自动得到通知并且被更新。这种模式属于行为型模式。

在 Go 语言中,我们可以使用接口和结构体来实现观察者模式。以下是实现观察者模式的示例代码:

package main

import "fmt"

// Observer 定义观察者接口
type Observer interface {
    Update(subject Subject)
}

// Subject 定义主题接口
type Subject interface {
    Register(observer Observer)
    Unregister(observer Observer)
    Notify()
}

// ConcreteObserver 实现观察者
type ConcreteObserver struct {
    name string
}

func (co *ConcreteObserver) Update(subject Subject) {
    fmt.Printf("%s received notification from %v\n", co.name, subject)
}

// ConcreteSubject 实现主题
type ConcreteSubject struct {
    observers []Observer
}

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

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

func (cs *ConcreteSubject) Notify() {
    for _, o := range cs.observers {
        o.Update(cs)
    }
}

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()
}

在上面的示例代码中,我们首先定义了两个接口:ObserverSubjectObserver 接口定义了观察者对象必须实现的方法 Update,而 Subject 接口定义了主题对象必须实现的方法 Register、UnregisterNotify

然后,我们实现了观察者对象 ConcreteObserver 和主题对象 ConcreteSubjectConcreteObserver 中的 Update 方法实现了当接收到通知时的行为,而 ConcreteSubject 中的 Register、UnregisterNotify 方法则实现了主题对象的注册、取消注册和通知观察者的行为。

在 main 函数中,我们创建了一个主题对象和两个观察者对象,并将观察者对象注册到主题对象中。然后,我们发送了两次通知,第一次会通知两个观察者对象,而第二次只会通知一个观察者对象(因为我们在第一次通知后取消了一个观察者对象的注册)。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~