Golang设计模式——23观察者模式

简介: Golang设计模式——23观察者模式

观察者模式

定义

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

优点

  1. 解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。
  2. 建立一套触发机制。

缺点

  1. 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  2. 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

场景

  1. 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。
  2. 事件多级触发场景。
  3. 跨系统的消息交换场景,如消息队列、事件总线的处理机制。

代码

package Observer
import (
  "fmt"
  "sync"
  "time"
)
type Event struct {
  Data int
}
type Observer interface {
  NotifyCallBack(event Event)
}
type Subject interface {
  AddListener(observer Observer)
  RemoveListener(observer Observer)
  Notify(event Event)
}
type ConcreteObserver struct {
  ID   int
  Time time.Time
}
type ConcreteSubject struct {
  Observers sync.Map
}
func (e *ConcreteObserver) NotifyCallBack(event Event) {
  fmt.Println(fmt.Sprintf("Recieved:%d after %v\n", event.Data, time.Since(e.Time)))
}
func (e *ConcreteSubject) AddListener(obs Observer) {
  e.Observers.Store(obs, struct{}{})
}
func (e *ConcreteSubject) RemoveListener(obs Observer) {
  e.Observers.Delete(obs)
}
func (e *ConcreteSubject) Notify(event Event) {
  e.Observers.Range(func(key, value interface{}) bool {
    if key == nil {
      return false
    }
    key.(Observer).NotifyCallBack(event)
    return true
  })
}
func Fib(n int) chan int {
  out := make(chan int)
  go func() {
    defer close(out)
    for i, j := 0, 1; i < n; i, j = j, i+j {
      out <- i
    }
  }()
  return out
}
package Observer
import (
  "sync"
  "testing"
  "time"
)
func TestFib(t *testing.T) {
  n := ConcreteSubject{Observers: sync.Map{}}
  obs1 := ConcreteObserver{
    ID:   1,
    Time: time.Now(),
  }
  obs2 := ConcreteObserver{
    ID:   1,
    Time: time.Now(),
  }
  n.AddListener(&obs1)
  n.AddListener(&obs2)
  for x := range Fib(10) {
    n.Notify(Event{Data: x})
  }
}

其他设计模式

设计模式Git源代码

00简单工厂模式

01工厂方法模式

02抽象工厂模式

03外观模式

04建造者模式

05桥接模式

06命令模式

07迭代器模式

08模板模式

09访问者模式

10备忘录模式

11责任链模式

12中介模式

13原型模式

14状态模式

15策略模式

16享元模式

17组合模式

18解释器模式

19单例模式

20适配器模式

21代理模式

22装饰器模式

23观察者模式


目录
相关文章
|
4月前
|
设计模式 监控 安全
设计模式 | 观察者模式
设计模式 | 观察者模式
20 0
|
4月前
|
设计模式 Go 开发工具
Golang设计模式——12中介模式
Golang设计模式——12中介模式
26 0
|
3月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
24天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
2月前
|
设计模式 存储 Java
【设计模式】观察者模式
【设计模式】观察者模式
|
8天前
|
设计模式 消息中间件 存储
【设计模式系列笔记】观察者模式
观察者模式是一种设计模式,它允许一个对象(主题)维护一组依赖于它的对象(观察者)并在状态发生变化时通知它们。这种模式属于行为型模式。在观察者模式中,主题是被观察的对象,而观察者是依赖于主题的对象,当主题的状态发生变化时,所有注册的观察者都会得到通知并自动更新。
19 0
|
22天前
|
设计模式 Java
23种设计模式,观察者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
24 2
|
2月前
|
设计模式 前端开发
观察者模式--设计模式
观察者模式--设计模式
10 0
|
4月前
|
设计模式 Java Spring
设计模式之观察者模式
设计模式之观察者模式
26 0
|
4月前
|
设计模式 算法 自动驾驶
常见的设计模式(模板与方法,观察者模式,策略模式)
随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改软件,如果不涉及好各个模块的关系,就会导致软件系统难以维护,从而导致软件变得不可使用。面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系
68 2