89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
|
package event
|
|||
|
|
|||
|
// eventHandlerInfo定义了事件处理器的信息
|
|||
|
type eventHandlerInfo struct {
|
|||
|
handler EventHandler // 事件处理函数
|
|||
|
once bool // 是否只执行一次
|
|||
|
}
|
|||
|
|
|||
|
// EventHandler定义了事件处理函数的类型
|
|||
|
type EventHandler func(params ...any)
|
|||
|
|
|||
|
// Event表示一个事件对象
|
|||
|
type Event struct {
|
|||
|
handlers []eventHandlerInfo // 事件处理器列表
|
|||
|
}
|
|||
|
|
|||
|
// Attach将事件处理器附加到事件对象中,并返回处理器在列表中的索引
|
|||
|
func (e *Event) Attach(handler EventHandler) int {
|
|||
|
handlerInfo := eventHandlerInfo{handler, true} //默认只执行一次
|
|||
|
for i, h := range e.handlers {
|
|||
|
if h.handler == nil {
|
|||
|
e.handlers[i] = handlerInfo
|
|||
|
return i
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
e.handlers = append(e.handlers, handlerInfo)
|
|||
|
|
|||
|
return len(e.handlers) - 1
|
|||
|
}
|
|||
|
|
|||
|
// Detach从事件对象中移除指定索引处的处理器
|
|||
|
func (e *Event) Detach(handle int) {
|
|||
|
e.handlers[handle].handler = nil
|
|||
|
}
|
|||
|
|
|||
|
// Once将事件处理器附加到事件对象中,并将处理器标记为只执行一次
|
|||
|
func (e *Event) Once(handler EventHandler) {
|
|||
|
i := e.Attach(handler)
|
|||
|
e.handlers[i].once = true
|
|||
|
}
|
|||
|
|
|||
|
// EventPublisher表示事件发布者
|
|||
|
type EventPublisher struct {
|
|||
|
event Event // 事件对象
|
|||
|
}
|
|||
|
|
|||
|
// Event返回事件对象的指针
|
|||
|
func (p *EventPublisher) Event() *Event {
|
|||
|
return &p.event
|
|||
|
}
|
|||
|
|
|||
|
// Publish触发事件,依次执行事件对象中的处理器,并在处理器标记为只执行一次时将其从事件对象中移除
|
|||
|
func (p *EventPublisher) Publish(params ...any) {
|
|||
|
for i, h := range p.event.handlers {
|
|||
|
if h.handler != nil {
|
|||
|
h.handler(params...)
|
|||
|
if h.once {
|
|||
|
p.event.Detach(i)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func GetEvent(fn func(params ...any)) *EventPublisher {
|
|||
|
publisher := &EventPublisher{}
|
|||
|
|
|||
|
// 定义一个事件处理器函数
|
|||
|
handler := fn
|
|||
|
// 将事件处理器附加到事件列表中
|
|||
|
publisher.Event().Attach(handler)
|
|||
|
return publisher
|
|||
|
}
|
|||
|
|
|||
|
/*func main() {
|
|||
|
// 在这里编写您的代码逻辑
|
|||
|
// 创建一个事件发布者
|
|||
|
publisher := &EventPublisher{}
|
|||
|
|
|||
|
// 定义一个事件处理器函数
|
|||
|
handler := func() {
|
|||
|
fmt.Println("Event handled!")
|
|||
|
}
|
|||
|
// 将事件处理器附加到事件列表中
|
|||
|
publisher.Event().Attach(handler)
|
|||
|
// 发布事件
|
|||
|
publisher.Publish()
|
|||
|
}*/
|