面试题答案
一键面试-
定义事件接口:
type Event interface{}
这里
Event
接口作为所有具体事件的基接口,实际应用中可以定义更具体的接口方法。 -
定义事件监听器接口:
type EventListener interface { OnEvent(event Event) }
实现该接口的结构体将具备处理事件的能力。
-
定义事件处理器:
type EventHandler struct { listeners []EventListener } func (eh *EventHandler) AddListener(listener EventListener) { eh.listeners = append(eh.listeners, listener) } func (eh *EventHandler) RemoveListener(listener EventListener) { for i, l := range eh.listeners { if l == listener { eh.listeners = append(eh.listeners[:i], eh.listeners[i+1:]...) break } } } func (eh *EventHandler) FireEvent(event Event) { for _, listener := range eh.listeners { listener.OnEvent(event) } }
EventHandler
结构体管理事件监听器列表,提供添加、移除监听器的方法,并能触发事件,让所有监听器处理该事件。 -
具体事件和监听器实现:
type ClickEvent struct{} type Button struct{} func (b *Button) OnEvent(event Event) { if _, ok := event.(ClickEvent); ok { println("Button clicked!") } }
这里定义了一个
ClickEvent
事件和Button
结构体,Button
实现了EventListener
接口,处理ClickEvent
事件。 -
使用示例:
func main() { eh := &EventHandler{} button := &Button{} eh.AddListener(button) eh.FireEvent(ClickEvent{}) eh.RemoveListener(button) eh.FireEvent(ClickEvent{}) }
在
main
函数中,创建事件处理器,添加按钮监听器,触发点击事件,然后移除监听器并再次触发事件。此时第二次触发事件,按钮监听器已移除,不会再有响应。