基于事件系统系统的软件架构
事件代表了某个事情的发生,例如某个用户点击了某个按钮,或者三国杀中某位玩家打出了一张杀牌或者策略牌。然后系统很多部件会对这个作出相应,这些相应应该是自洽的,言下之意这些相应可以自己处理自己,而不需要别人来维护。例如某人打出一个“万箭齐发”,其他人都应该相应这个牌。
应该有一个事件总线,他具有绑定事件函数和触发事件函数,可以使开发人员动态的维护事件响应,当事件发生的时候,根据事件id来找到绑定的事件处理器,然后这些处理器会处理事件相关业务。这些处理器处理业务所需要的数据,均在事件(通过事件的属性或者闭包)中带过去。
我们首先要有一个事件容器,他的bind(String eventId,EventProcesser)方法将事件处理器绑定到对应的事件中,在triggle(Event event)方法中触发event对应id的事件处理器。
事件应该有getSrc方法,返回事件源,事件处理器可以根据事件对象找到事件源对象,做相应的处理。
事件总线、处理器、事件关系如下图
业务类包含有事件总线对象,通过将bind和triggle方法委托给事件总线来完成对事件的操作。业务类可以是一个单例的服务类,也可以是基于orm的javabean,后者还要求将事件处理器和本身持久化保存到数据库中。
如果是javascript就不用这么麻烦,考虑持久化是一个比较麻烦的事情。
事件总线可以和有限状态机联合使用,有限状态机的事件和总线事件应该是同一个类,虽然我没有想好如何将两者联合使用,但是实际上这两者的使用,可以给系统带来很好的解耦性。
事件的处理可以是异步的,也可以是同步的,还可以跟例如activemq之类的消息总线联合,这些机制的整合是一个难题。
事件代表了某个事情的发生,例如某个用户点击了某个按钮,或者三国杀中某位玩家打出了一张杀牌或者策略牌。然后系统很多部件会对这个作出相应,这些相应应该是自洽的,言下之意这些相应可以自己处理自己,而不需要别人来维护。例如某人打出一个“万箭齐发”,其他人都应该相应这个牌。
应该有一个事件总线,他具有绑定事件函数和触发事件函数,可以使开发人员动态的维护事件响应,当事件发生的时候,根据事件id来找到绑定的事件处理器,然后这些处理器会处理事件相关业务。这些处理器处理业务所需要的数据,均在事件(通过事件的属性或者闭包)中带过去。
我们首先要有一个事件容器,他的bind(String eventId,EventProcesser)方法将事件处理器绑定到对应的事件中,在triggle(Event event)方法中触发event对应id的事件处理器。
事件应该有getSrc方法,返回事件源,事件处理器可以根据事件对象找到事件源对象,做相应的处理。
事件总线、处理器、事件关系如下图
业务类包含有事件总线对象,通过将bind和triggle方法委托给事件总线来完成对事件的操作。业务类可以是一个单例的服务类,也可以是基于orm的javabean,后者还要求将事件处理器和本身持久化保存到数据库中。
如果是javascript就不用这么麻烦,考虑持久化是一个比较麻烦的事情。
事件总线可以和有限状态机联合使用,有限状态机的事件和总线事件应该是同一个类,虽然我没有想好如何将两者联合使用,但是实际上这两者的使用,可以给系统带来很好的解耦性。
事件的处理可以是异步的,也可以是同步的,还可以跟例如activemq之类的消息总线联合,这些机制的整合是一个难题。