《大话设计模式-Golang》观察者模式

概念

观察者模式(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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值