如何使用go来实现观察者模式

本文探讨如何在非面向对象编程的Go语言中实现观察者模式,通过理解C#委托的本质并利用Go的函数指针,使用map来模拟委托功能。通过定义接口和struct,实现了观察者模式,并强调了掌握底层基础知识在编程中的重要性。

如何使用go来实现观察者模式

简介

最近在学习go语言,学习一门语言最好的方法,就是实践啦,于是我心血来潮,有一个大胆的想法,就是如何使用go这种非面向对象编程的语言来实现观察者模式呢?于是便有了这片博客,这里不再详细介绍观察者模式,如果需要了解观察者模式的话,请参考我之前的博客观察者模式

实现

思路

首先,我们知道,观察者模式是基于委托或者事件来实现的,但是,go并没有像C#那样,提供了委托这种内置类型,这个时候,我们就需要知道,C#的委托实际上是什么呢?

其实C#委托的本质,就是用于保存一个或多个函数指针的一种类型。哦豁🧐,突然发现go是支持函数指针的,这样的话我们就可以使用go中的函数指针,另外,委托是用来保存一个或多个函数指针的,对应着go的话,可以使用slice或者map来保存。

接下来我们就可以模拟C#中的委托啦。🤩🤩

代码

首先,我们定义一下老板和员工的struct.

type Boss struct{
	name string
	delegate map[string]func()
}
type Staff struct{
	name string
}

这里我用了map类型来模拟委托是因为,委托既可以+=也可以-=的,而map实现起来最为方便。

接下来定义两个接口,一个是Notificator,一个是Observer

//消息发送者
type Notificator interface {
	Attach(name string, handleFunc func())
	Detach(name string) error
	Notify() error
}
//观察者
type Observer interface{
	Handle()
}

接着我们来实现这两个接口,Boss实现Notificator接口,Staff实现Observer接口。

func (b *Boss) Attach(name string, handleFunc func()){
	if b.delegate == nil{
		b.delegate = make(map[string]func())
	}
	b.delegate[name] = handleFunc

}
func (b *Boss) Detach(name string) error{
	if _, ok := b.delegate[name]; ok {
		delete(b.delegate, name)
		return nil
	}else {
		return fmt.Errorf("handle function <%s> does not exist", name)
	}
}
func (b *Boss) Notify() error{
	if b.delegate != nil {
		for _, handleFunc := range b.delegate {
			handleFunc()
		}
		return nil
	}else {
		return fmt.Errorf("no handle function was attached")
	}
}

func (s *Staff) Handle(){
	fmt.Printf("%s is handling boss coming\n", s.name)
}

好了,接着我们就可以直接来看看效果如何了🤔🤔

func main(){
	s1 := Staff{ name: "jack"}
	s2 :=Staff{ name:"tom"}
	boss := Boss{ name:"boss"}
	boss.Attach(s1.name,s1.Handle)
	boss.Attach(s2.name, s2.Handle)
	err := boss.Notify()
	if err != nil {
		fmt.Println(err)
	}

	boss.Detach(s1.name)
	boss.Notify()
	err = boss.Detach(s1.name)
	fmt.Println(err)

}
jack is handling boss coming
tom is handling boss coming
tom is handling boss coming
handle function <jack> does not exist

嗯,这个结果很完美🤨

总结

其实基础很重要(这句话都听烂掉了)。有了某个领域的底层基础知识(原理),你会发现很多东西都是一样的,只是表现不一样而已,就好比生物,其底层的构造是DNA或者RNA(当然这不一定是最底层的),但表现形式有各种各样的(高中生物中的生物多样性?🤨)。这里强调的是底层基础知识(原理),对于编程来说,就是数据结构、算法、操作系统、编程语言的底层原理等等(都是一些听着就秃头的知识🥶🥶)。

最后,我们一起学习这些底层基础(秃头😏)知识吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值