专栏名称: silsuer在掘金
后端研发 - go/php
目录
51好读  ›  专栏  ›  silsuer在掘金

golang设计模式之观察者模式

silsuer在掘金  · 掘金  ·  · 2018-12-03 07:46

正文

请到「今天看啥」查看全文


简单点说,可以想象成多个对象同时观察一个对象,当这个被观察的对象发生变化的时候,这些对象都会得到通知,可以做一些操作...

多啰嗦几句

PHP 世界中,最出名的观察者模式应该就是 Laravel 的事件了, Laravel 是一个事件驱动的框架,所有的操作都通过事件进行解耦,实现了一个简单的观察者模式,比较典型的一个使用就是 数据库模型 ,当观察到模型更改的时候,就会触发事件( created / updated / deleted ...)

最开始用模型观察者的时候,只要在 Observers 目录中创建一个观察者对象,并且添加观察者关联,当修改模型的时候,就可以自动触发了,感觉好神奇喔...

观察者模式在实际开发中经常用到,主要存在于底层框架中,与业务逻辑解耦,业务逻辑只需要实现各种观察者被观察者即可。

类图

(图源网络)

角色

  • 抽象观察者

  • 具体观察者

  • 抽象被观察者

  • 具体被观察者

举个栗子

  1. 创建抽象观察者
  // 抽象观察者
  type IObserver interface {
  	Notify() // 当被观察对象有更改的时候,出发观察者的Notify() 方法
  }
复制代码
  1. 创建抽象被观察者
// 抽象被观察者
type ISubject interface {
    AddObservers(observers ...IObserver) // 添加观察者
    NotifyObservers()                    // 通知观察者
}
复制代码
  1. 实现观察者
 
 type Observer struct {
 }

 func (o *Observer) Notify() {
     fmt.Println("已经触发了观察者")
 }
复制代码
  1. 实现被观察者
 
 type Subject struct {
     observers []IObserver
 }
 
 func (s *Subject) AddObservers(observers ...IObserver) {
     s.observers = append(s.observers, observers...)
 }
 
 func (s *Subject) NotifyObservers()






请到「今天看啥」查看全文