为了账号安全,请及时绑定邮箱和手机立即绑定

Go 方式实现观察者设计模式

Go 方式实现观察者设计模式

Go
蛊毒传说 2023-07-04 15:04:17
我的经验是使用 OOP 语言,但我已经开始尝试 Go。我无法找到在 Go 中实现观察者设计模式的最佳方法。我按如下方式组织我的项目,其中observers文件夹中的所有内容都是 的一部分package observers,并且subjects文件夹中的所有内容都是package subjects. 将观察者附加到主题是在 中完成的main.go。my-project/  main.go  observers/    observer.go    observer_one.go    observer_two.go  subjects/    subject.go    subject_one.go我在 Go wiki 中看到过有关接口的部分:Go 接口通常属于使用接口类型值的包,而不是实现这些值的包。实现包应该返回具体的(通常是指针或结构)类型:这样,可以将新方法添加到实现中,而不需要大量重构。牢记 Go Wiki 的评论。我已经这样实现了(省略了函数实现):主题.go:type ObserverInterface interface {    Update(subject *Subject, updateType string)}type Subject struct {    observers map[string][]ObserverInterface}func (s *Subject) Attach(observer ObserverInterface, updateType string) {}func (s *Subject) Detach(observer ObserverInterface, updateType string) {}func (s *Subject) notify(updateType string) {}观察者.go:type SubjectInterface interface {   Attach(observer Observer, updateType string)   Detach(observer Observer, updateType string)   notify(updateType string)}type Observer struct {    uuid uuid.UUID}观察者_one.gotype ObserverOne struct {    Observer}func (o *ObserverOne) Update(subject *SubjectInterface, updateType string) {}主程序subjectOne := &SubjectOne{}observerOne := &ObserverOne{Observer{uuid: uuid.New()}}subjectOne.Attach(observerOne, "update_type")我希望能够使用in 方法SubjectInterface的参数,这样我就可以避免我的包和我的包之间存在依赖关系,但我收到以下编译时错误。Update()ObserverOnesubjectobserverobservers/observer_one.go:29:35: cannot use &observer (type *ObserverOne) as type subjects.ObserverInterface in argument to SubjectOne.Subject.Attach:    *ObserverOne does not implement subjects.ObserverInterface (wrong type for Update method)        have Update(*SubjectInterface, string)        want Update(*subjects.Subject, string)Update()如果我用以下内容替换observer_one.go中的定义,它可以正常编译,但我认为这个想法是使用接口来解耦包:func (o *ObserverOne) Update(subject *subjects.Subject, updateType string) {}
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

首先,不要使用接口指针。

func (o *ObserverOne) Update(subject *SubjectInterface, updateType string) {}

应该

func (o *ObserverOne) Update(subject SubjectInterface, updateType string) {}

其次,您已将接口定义为需要具体类型:

type ObserverInterface interface {
    Update(subject *Subject, updateType string)
}

相反,让它接受一个接口:

type ObserverInterface interface {
    Update(subject SubjectInterface, updateType string)
}


查看完整回答
反对 回复 2023-07-04
  • 1 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信