go语言设计模式之观察者模式(程序员必修课)

jaminliu0 2019-02-21

本文主要说一下设计模式之观察者模式,后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(vx公号,csdn:Go语言之美。更多go语言知识信息等)。

go语言设计模式之观察者模式(程序员必修课)

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

go语言设计模式之观察者模式(程序员必修课)

简单说,就是有一些人想知道某个事物的状态,当这个事物状态变化时,这些人都能够及时收到消息,同时这些人可以根据这个事物的修改的状态来决定自己做什么。上代码:

package main
import "fmt"
type Subject interface {
   AddObserver(observer Observer)
   RemoveObserver(observer Observer)
   Notify(str string)
}
type Observer interface {
   Update(str string)
}
type SubjectObj struct {
   state string
   observers []Observer
}
func (this *SubjectObj) setState(state string) {
   this.state = state
   this.Notify(state)
}
func (this *SubjectObj) AddObserver(observer Observer) {
   this.observers = append(this.observers, observer)
}
func (this *SubjectObj) RemoveObserver(observer Observer) {
   for i, v := range this.observers {
      if v == observer {
         this.observers = append(this.observers[:i], this.observers[i+1:]...)
      }
   }
}
func (this *SubjectObj) Notify(str string) {
   for _, v := range this.observers {
      v.Update(str)
   }
}
type ObserverA struct{}
func (this ObserverA) Update(str string) {
   fmt.Println("I'm observer A, subject has changed to " + str)
}
type ObserverB struct{}
func (this ObserverB) Update(str string) {
   fmt.Println("I'm observer B,subject has changed to " + str)
}
type ObserverC struct{}
func (this ObserverC) Update(str string) {
   fmt.Println("I'm observer C,subject has changed to " + str)
}
func main() {
   sub := SubjectObj{}
   ob1, ob2, ob3 := ObserverA{}, ObserverB{}, ObserverC{}
   sub.AddObserver(ob1)
   sub.AddObserver(ob2)
   sub.AddObserver(ob3)
   sub.RemoveObserver(ob2)
   sub.setState("sleep")
}

go语言设计模式之观察者模式(程序员必修课)

我们来解释一下上面的代码,我们有了Subject,同时有多个Observer想知道Subject的状态是否改变了,所以我们就将 ob1、ob2、ob3都加入想知道Subject的状态的阵营,但是ob2不想知道了,所以我们也可以将它移出。这样,当我们新建的sub对象的state变成sleep的时候,ob1和ob3都及时收到了消息。

那我们什么时候用观察者模式呢?当一个对象改变了,其他对象需要知道改变的时候就需要用这个模式。

那我们为什么不直接让被观察者直接通知观察者?为了解耦,用了这种模式,观察者和被观察者互相都不认识,他们都依赖于抽象,被观察者不需要知道都有谁在观察他,两边都是独立的互不影响。

设计模式不是一成不变的,每一种模式都只是一个框架,具体里面我们要根据自己的需求来具体实现,我们最重要的就是理解每一种模式的流程,这样做项目才能游刃有余。

相关推荐