23种软件设计模式之观察者模式,go语言实现

一.定义

观察者模式定义:对象的一种一对多的依赖关系,当一个对象状态变化时,所依赖它的对象得到通知并自动更新

二.应用场景

事件模型中的事件源与事件处理者

三.代码

先看使用

func main() {
	fmt.Printf("this is a observer design pattern demo ...\n")
	//创建被观察者也可以叫主题
	hansenSubject := SubjectNew("Create")
	//创建观察者
	Observer1 := ObServerNew("Observer1")
	Observer2 := ObServerNew("Observer2")
	Observer3 := ObServerNew("Observer3")
	//绑定观察者
	hansenSubject.Binding(Observer1)
	hansenSubject.Binding(Observer2)
	hansenSubject.Binding(Observer3)
	//通知所有观察者
	hansenSubject.Notify("csdn-blog")
}

运行结果

[Create] subject notify [csdn-blog]event to [Observer1] observer
[Create] subject notify [csdn-blog]event to [Observer2] observer
[Create] subject notify [csdn-blog]event to [Observer3] observer

原理实现

//观察者
type ObServer struct {
	Name string
}
//被观察者(主题)
type Subject struct {
	Name  string
	obMap map[string]*ObServer
}
//收到通知做出更新事件处理
func (ob *ObServer) UpdateProc(su *Subject, event string) {
	fmt.Printf("[%v] subject notify [%v]event to [%v] observer\n", su.Name, event, ob.Name)
}
//通知所有观察者
func (s *Subject) Notify(event string) {
	for _, v := range s.obMap {
		v.UpdateProc(s, event)
	}
}
//删除观察者
func (s *Subject) Del(ob *ObServer) {
	delete(s.obMap, ob.Name)
}
//绑定添加观察者
func (s *Subject) Binding(ob *ObServer) {
	//添加观察者到map中
	s.obMap[ob.Name] = ob
}

func ObServerNew(ObServerName string) *ObServer {
	//new 一个对象
	return &ObServer{
		Name: ObServerName ,
	}
}

func SubjectNew(subjectName string) *Subject {
	//new 一个对象
	return &Subject{
		Name:  subjectName,
		obMap: make(map[string]*ObServer),
	}
}

//go语言在线测试
//http://www.dooccn.com/go/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章