一架梯子,一头程序猿,仰望星空!
Golang设计模式教程 > 内容正文

Golang观察者模式


1. 什么是观察者模式

观察者模式是一种行为型设计模式,用于在对象之间建立一对多的依赖关系。具体而言,当一个对象(称为主题或者被观察者)发生改变时,它的所有依赖对象(称为观察者)都会得到通知并自动更新。该模式允许主题和观察者之间的松耦合,从而实现对象间的解耦和灵活性。

2. 观察者模式的特点和优点

观察者模式具有以下特点和优点:

  • 主题和观察者之间是松耦合的,主题不需要知道观察者的具体实现细节。
  • 可以动态地添加和删除观察者,使系统更加灵活。
  • 主题和观察者之间遵循开闭原则,可以独立地进行扩展和重用。
  • 可以实现一对多的依赖关系,一个主题可以有多个观察者。

3. 观察者模式的实际应用场景举例

观察者模式在现实生活中有很多应用场景,例如:

  • GUI界面中的事件处理机制,如按钮被点击时的处理动作。
  • 股票市场的实时行情推送。
  • 电商平台中的促销活动通知。

4. Golang中的观察者模式实现

4.1 UML类图

Golang中的观察者模式

4.2 示例介绍

在这个示例中,我们有一个主题(Subject)和两个观察者(ObserverA和ObserverB)。主题可以注册、注销和通知观察者。

4.3 实现步骤

4.3.1 创建主题接口和具体主题类

type Subject interface {
    RegisterObserver(observer Observer)
    RemoveObserver(observer Observer)
    NotifyObservers()
}

type ConcreteSubject struct {
    observers []Observer
}

// 注册监听对象
func (subject *ConcreteSubject) RegisterObserver(observer Observer) {
    subject.observers = append(subject.observers, observer)
}

// 删除监听对象
func (subject *ConcreteSubject) RemoveObserver(observer Observer) {
    for i, obs := range subject.observers {
        if obs == observer {
            subject.observers = append(subject.observers[:i], subject.observers[i+1:]...)
            break
        }
    }
}

// 触发事件通知
func (subject *ConcreteSubject) NotifyObservers() {
    for _, observer := range subject.observers {
        observer.Update()
    }
}

4.3.2 创建观察者接口和具体观察者类

type Observer interface {
    Update()
}

type ConcreteObserverA struct {}

func (observer *ConcreteObserverA) Update() {
    fmt.Println("Observer A is notified.")
}

type ConcreteObserverB struct {}

func (observer *ConcreteObserverB) Update() {
    fmt.Println("Observer B is notified.")
}

4.4 示例代码演示

func main() {
    subject := &ConcreteSubject{}
    observerA := &ConcreteObserverA{}
    observerB := &ConcreteObserverB{}

    subject.RegisterObserver(observerA)
    subject.RegisterObserver(observerB)

    subject.NotifyObservers()

    subject.RemoveObserver(observerA)

    subject.NotifyObservers()
}

输出结果:

Observer A is notified.
Observer B is notified.
Observer B is notified.

上述示例代码演示了观察者模式的具体实现,主题(ConcreteSubject)注册了两个观察者(ObserverA和ObserverB),然后通知了这两个观察者。之后,从主题中注销了观察者A,并再次通知剩下的观察者B。