go设计模式之观察者模式浅谈|GO主题月

202 阅读1分钟

概念

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并作出相应的行为

要素

1.Observer 观察者,观察者观察主题状态发生改变,作出反应
2.Subject 主题,主题发生状态改变时,通知观察者

概念解析

我们初中学生物课的时候,里面有一个例子,当发生地震时,不同的动物有不同的反应,狗会汪汪叫,鸡鸭鹅会高飞,这里我们可以把各种动物比喻成观察者,地震比喻为主题

代码分析

观察者们(动物们)

//动物接口,定义了动物作出反应的行为
type Animal interface {
	Response()
}
//鸭子,实现Animal接口
type Duck struct{}

func (*Duck) Response() {
	fmt.Println("家禽高飞")
}
//狗,实现Animal接口
type Dog struct{}

func (*Dog) Response() {
	fmt.Println("狗汪汪叫...")
}

主题(地震)

//地震现象
type Earthquake struct {
	animals []Animal//所有对地震作出反应的动物们
}

//添加动物,添加相应的动物后,当地震发生时,被添加动物会自动作出反应
func (earthquake *Earthquake) AddAnimals(animal Animal) {
	earthquake.animals = append(earthquake.animals, animal)
}
//发生地震,通知动物们
func (earthquake *Earthquake) Quake() {
	for _, animal := range earthquake.animals {
		animal.Response()
	}
}

模拟地震发生过程

earthquake := Earthquake{}
earthquake.AddAnimals(new(Dog))
earthquake.AddAnimals(new(Duck))
earthquake.Quake()//会打印出 狗汪汪叫...   家禽高飞

观察者模式实现的是一种松耦合,松耦合存在一定问题,例如以后地震发生,家禽除了高飞外,还存在不进食,狗除了汪汪叫,还会到处乱跑等等,这时我们就要修改Quake的代码,怎么解决这个问题,就引申出发布订阅者模式