概念
观察者模式(MonitorPattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主体对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
需求
利用观察者模式实现老板来了,同事们停止摸鱼
UML图
代码
观察者和通知者抽象接口
//IObserver 观察者接口
type IObserver interface {
Update()
}
//ISubject 通知者接口
type ISubject interface {
Attach(observer IObserver)
Detach(observer IObserver)
Notify()
}
观察者和通知者抽象类
type Observer struct {
Name string
Sub ISubject
}
func (o *Observer) Update() {
}
type Subject struct {
Observers []IObserver
Action string
}
func (s *Subject) Attach(observer IObserver) {
}
func (s *Subject) Detach(observer IObserver) {
}
func (s *Subject) Notify() {
}
老板类和秘书类
//Boss 老板类继承通知者类
type Boss struct {
Subject
}
func (b *Boss) Attach(observer IObserver) {
b.Observers = append(b.Observers, observer)
}
func (b *Boss) Detach(observer IObserver) {
for i := 0; i < len(b.Observers); i++ {
if b.Observers[i] == observer {
b.Observers = append(b.Observers[:i], b.Observers[i+1:]...)
}
}
}
func (b *Boss) Notify() {
for i := 0; i < len(b.Observers); i++ {
b.Observers[i].Update()
}
}
----------------------------------
type Secretary struct {
Subject
}
func (b *Secretary) Attach(observer IObserver) {
b.Observers = append(b.Observers, observer)
}
func (b *Secretary) Detach(observer IObserver) {
for i := 0; i < len(b.Observers); i++ {
if b.Observers[i] == observer {
b.Observers = append(b.Observers[:i], b.Observers[i+1:]...)
}
}
}
func (b *Secretary) Notify() {
for i := 0; i < len(b.Observers); i++ {
b.Observers[i].Update()
}
}
摸鱼看股市的同事类和摸鱼看NBA的同事类
type StockObserver struct {
Observer
}
func NewStockObserver(name string, subject ISubject) StockObserver {
stockObserver := StockObserver{}
stockObserver.Name = name
stockObserver.Sub = subject
return stockObserver
}
func (o *StockObserver) Update() {
fmt.Printf("%v 关闭股票行情,继续上班", o.Name)
fmt.Println()
}
-------------------------------------
type NbaObserver struct {
Observer
}
func NewNbaObserver(name string, subject ISubject) NbaObserver {
nbaObserver := NbaObserver{}
nbaObserver.Name = name
nbaObserver.Sub = subject
return nbaObserver
}
func (o *NbaObserver) Update() {
fmt.Printf("%v 关闭NBA,继续上班", o.Name)
fmt.Println()
}
测试
//观察者模式
huhansan := monitorPattern.Boss{}
tongshi1 := monitorPattern.NewStockObserver("魏关姹", &huhansan)
tongshi2 := monitorPattern.NewNbaObserver("易管查", &huhansan)
huhansan.Attach(&tongshi1)
huhansan.Attach(&tongshi2)
huhansan.Detach(&tongshi1)
huhansan.Notify()