go 新人,想写一个观察者模式。涉及到继承和重写。想请教一下大佬们.
流程就是,消费者监听用户的创建和删除事件
事件:
# 事件
type Event interface {
attach(observer Observer)
notifyAll()
}
//基础事件
type BaseEvent struct {
observers []Observer
msg interface{}
}
func (b *BaseEvent) attach(observer Observer) {
b.observers = append(b.observers, observer)
}
func (b *BaseEvent) notifyAll() {
for _, o := range b.observers {
o.Notify(b)
}
}
type User struct {
name string
}
//用户事件
type UserEvent struct {
BaseEvent
u User
}
func (u *UserEvent) Created() {
u.msg = fmt.Sprintf("user %s is created", u.u.name)
u.notifyAll()
}
func (u *UserEvent) Deleted() {
u.msg = fmt.Sprintf("user %s is Deleted", u.u.name)
u.notifyAll()
}
监听者
# 监听者定义
type Observer interface {
Notify(event Event)
addEvent(event Event)
}
type BaseObserver struct {
}
# 监听者基础
func (o *BaseObserver) addEvent(event Event) {
event.attach(o)
}
func (o *BaseObserver) Notify(event Event) {
fmt.Println("BaseObserver notify")
}
# 文档监听者
type DocumentObserver struct {
BaseObserver
}
func (d *DocumentObserver) Notify(event Event) {
e, ok := event.(*UserEvent)
if ok {
fmt.Println(e.msg)
}
}
测试代码
func TestDocumentObserver(t *testing.T) {
uEvent := &UserEvent{}
doObserver := &DocumentObserver{}
doObserver.addEvent(uEvent)
uEvent.Created()
}
结果
=== RUN TestDocumentObserver
BaseObserver notify
--- PASS: TestDocumentObserver (0.00s)
PASS
为什么,不会执行 Document 内部的代码,明明重写了父亲的方法额,应该如何修改呢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.