简介
最近在学习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(当然这不一定是最底层的),但表现形式有各种各样的(高中生物中的生物多样性?🤨)。这里强调的是底层基础知识(原理),对于编程来说,就是数据结构、算法、操作系统、编程语言的底层原理等等(都是一些听着就秃头的知识🥶🥶)。
最后,我们一起学习这些底层基础(秃头😏)知识吧。
本文探讨如何在非面向对象编程的Go语言中实现观察者模式,通过理解C#委托的本质并利用Go的函数指针,使用map来模拟委托功能。通过定义接口和struct,实现了观察者模式,并强调了掌握底层基础知识在编程中的重要性。

1425

被折叠的 条评论
为什么被折叠?



