go语言设计模式之观察者模式(程序员必修课)
本文主要说一下设计模式之观察者模式,后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(vx公号,csdn:Go语言之美。更多go语言知识信息等)。
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
简单说,就是有一些人想知道某个事物的状态,当这个事物状态变化时,这些人都能够及时收到消息,同时这些人可以根据这个事物的修改的状态来决定自己做什么。上代码:
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") }
我们来解释一下上面的代码,我们有了Subject,同时有多个Observer想知道Subject的状态是否改变了,所以我们就将 ob1、ob2、ob3都加入想知道Subject的状态的阵营,但是ob2不想知道了,所以我们也可以将它移出。这样,当我们新建的sub对象的state变成sleep的时候,ob1和ob3都及时收到了消息。
那我们什么时候用观察者模式呢?当一个对象改变了,其他对象需要知道改变的时候就需要用这个模式。
那我们为什么不直接让被观察者直接通知观察者?为了解耦,用了这种模式,观察者和被观察者互相都不认识,他们都依赖于抽象,被观察者不需要知道都有谁在观察他,两边都是独立的互不影响。
设计模式不是一成不变的,每一种模式都只是一个框架,具体里面我们要根据自己的需求来具体实现,我们最重要的就是理解每一种模式的流程,这样做项目才能游刃有余。