观察者模式练习:升级事件

观察者模式练习:升级事件

假设现在有这样一个场景:玩家打怪升级时,发放相应的奖励。怎么实现?

个人认为,这就是一种“达到什么什么条件,就做什么什么”的场景。可以用上篇文章提到的观察者模式来解决。

 

参考上篇文章:

使用事件驱动的简单例子(观察者模式)

一、实现

项目结构为:

QQ截图20180516205650

(1)写出玩家类

打怪的是玩家,升级的是玩家,发出事件的还是玩家。先来实现一个玩家实体:

Player.java

为了简单起见,不引入经验值等概念。只要kill,就升级,就发送事件。

(2)写一个事件接口和实现类

既然要发出一个事件,那就需要一个事件类。这个事件类包含了处理器类需要的所有信息。

事件也需要规范,要告诉别人“我是一个什么事件?”。先写一个事件接口:

Event.java

实现之:

LevelUpEvent.java

这就是一个简单的升级事件,通过getEventType方法告诉外界“我是升级事件”。

(3)写一个事件监听器

监听类中储存了所有处理器类的信息。一旦收到了事件,这个监听类就会根据事件类型,把事件交给对应的处理器类处理。

EventListener.java

EventListener这个私有构造方法,在EventListener对象的初始化阶段就加入了所有处理器。

postEvent方法通过事件的类型,就能拿到需要的处理器列表,把事件交给他们处理。

(4)写一个处理器接口与实现类

处理器是需要规范的,要知道“我这个处理器处理的是哪一类事件?”,“收到这个事件之后我要干些什么?”。先写一个接口:

Processor.java

实现之:

LevelUpRankProcessor.java

收到玩家升级事件后,进行排名计算。

LevelUpRewardProcessor.java

收到玩家升级事件后,发放相应奖励。

处理器类通过getEventType方法告诉外界“我这个处理器处理的是升级事件!”,通过doEvent方法对收到的事件进行处理。

(5)写一个测试类

非常简单,玩家打怪:

Test.java

运行结果为:

(6)新的需求

现在有个新的需求,要求玩家满级后,发送一条系统公告。

首先再写一个处理器类:

LevelMaxAnnounceProcessor.java

把该处理器加入事件监听类中:

EventListener.java

改写测试类:

Test.java

运行结果:

二、总结

简单练习,有机会可以多多使用。

发布者

xie4ever

发表评论

电子邮件地址不会被公开。