初始
This commit is contained in:
88
third/plane/event/event.go
Normal file
88
third/plane/event/event.go
Normal file
@ -0,0 +1,88 @@
|
||||
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()
|
||||
}*/
|
Reference in New Issue
Block a user