遗留问题:当监听事件的方法 参数不一致时,会直接报错,而不是 不执行
如果没有其他问题,应该是最终版本了。如有发现问题的大神,请留言谢谢
public interface IEvent {
void iWantUseEvent();
default void iNotUseEvent() {
Event.delete(this);
}
}
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Event {
private static Map<Object, Map<String, EventDefine>> events = new ConcurrentHashMap<>();
public static void init(IEvent user) {
user.iWantUseEvent();
}
public static void release(Object promulgator, String eventName) {
Map<String, EventDefine> promulgatorEvent = events.get(promulgator);
if (promulgatorEvent == null) {
promulgatorEvent = new ConcurrentHashMap<>();
promulgatorEvent.put(eventName, new EventDefine(eventName));
events.put(promulgator, promulgatorEvent);
} else {
EventDefine eventDefine = promulgatorEvent.get(eventName);
if (eventDefine == null) {
promulgatorEvent.put(eventName, new EventDefine(eventName));
} else {
System.out.println(promulgator + " 已发布过 eventName为 " + eventName + " 的 事件委托");
}
}
}
public static boolean listen(Object promulgator, Object receiver, String eventName, String methodName) {
Map<String, EventDefine> promulgatorDefineMap = events.get(promulgator);
if (promulgatorDefineMap == null) {
System.out.println("没有 " + promulgator + " 发布的 事件委托");
return false;
}
EventDefine eventDefine = promulgatorDefineMap.get(eventName);
if (eventDefine == null) {
System.out.println(promulgator + " 没有发布eventName为 " + eventName + " 的事件委托");
return false;
}
eventDefine.add(receiver, methodName);
return true;
}
public static void remove(Object promulgator, Object receiver, String eventName) {
Map<String, EventDefine> promulgatorDefineMap = events.get(promulgator);
if (promulgatorDefineMap == null) {
System.out.println(promulgator + " 没有发布过 事件委托 ");
return;
}
EventDefine eventDefine = promulgatorDefineMap.get(eventName);
if (eventDefine == null) {
System.out.println(promulgator + " 没有发布eventName为 " + eventName + " 的 事件委托");
return;
}
eventDefine.remove(receiver);
}
public static void delete(Object promulgator, String eventName) {
Map<String, EventDefine> promulgatorDefineMap = events.get(promulgator);
if (promulgatorDefineMap != null) {
promulgatorDefineMap.remove(eventName);
System.err.println(promulgator + "不再发布eventName为 " + eventName + " 的事件");
}
}
public static void delete(Object promulgator) {
if (events.containsKey(promulgator)) {
events.remove(promulgator);
System.out.println(promulgator + " 将之前发布的事件全部移除了");
System.out.println("还发布有 事件委托 的对象个数为:" + events.size());
}
}
public static void invoke(Object promulgator, String eventName, Object... params) {
Map<String, EventDefine> promulgatorDefineMap = events.get(promulgator);
if (promulgatorDefineMap == null) {
System.out.println(promulgator + " 没有发布过 事件委托");
return;
}
EventDefine eventDefine = promulgatorDefineMap.get(eventName);
if (eventDefine == null) {
System.out.println(promulgator + " 没有发布eventName为 " + eventName + " 的 事件委托");
return;
}
eventDefine.send(params);
}
private static class EventDefine {
private String eventName;
private Map<Object, String> eventMap = null;
public EventDefine(String eventName) {
this.eventName = eventName;
}
public void add(Object object, String methodName) {
if (eventMap == null) {
eventMap = new ConcurrentHashMap<>();
eventMap.put(object, methodName);
} else if (!eventMap.containsKey(object)) {
eventMap.put(object, methodName);
}
}
public void remove(Object object) {
eventMap.remove(object);
}
public void send(Object... params) {
Class[] classes = paramsToTypes(params);
try {
for (Object object : eventMap.keySet()) {
Method method = object.getClass().getMethod(eventMap.get(object), classes);
if (method != null) {
method.invoke(object, params);
} else {
System.out.println("没这方法");
}
}
} catch (Exception e) {
System.out.println("eventName为:" + eventName + "的调用发生了错误");
e.printStackTrace();
}
}
private static Class[] paramsToTypes(Object... params) {
if (params == null) {
return null;
}
Class[] paramTypes = new Class[params.length];
for (int i = 0; i < params.length; i++) {
paramTypes[i] = params[i].getClass();
}
return paramTypes;
}
}
}
下面是配合 测试使用的代码
import com.card.event.Event;
import com.card.event.IEvent;
public class Player implements IEvent {
private int hp;
private int mp;
private int gold;
Bag bag = new Bag();
@Override
public void iWantUseEvent() {
Event.release(this, "goldUpdate");
Event.release(this, "hpUpdate");
Event.release(this, "mpUpdate");
}
public Player() {
Event.init(this);
bag.init(this);
}
@Override
public void iNotUseEvent(){
Event.delete(this);
}
public void listenEvent(Object listener, String eventName, String methodName) {
Event.listen(this, listener, eventName, methodName);
}
public int getHp() {
return hp;
}
public void setHp(Integer hp) {
this.hp = hp;
Event.invoke(this, "hpUpdate", hp);
}
public int getMp() {
return mp;
}
public void setMp(Integer mp) {
this.mp = mp;
Event.invoke(this, "mpUpdate", mp);
}
public int getGold() {
return gold;
}
public void setGold(Integer gold) {
this.gold = gold;
Event.invoke(this, "goldUpdate", gold);
}
}
public class Bag {
private Player owner;
public void init(Player player){
owner = player;
owner.listenEvent(this,"goldUpdate","onGoldUpdate");
owner.listenEvent(this,"hpUpdate","onHpUpdate");
owner.listenEvent(this,"mpUpdate","onMpUpdate");
}
public void onGoldUpdate(Integer gold){
System.out.println("收到gold变化为:" + gold);
}
public void onHpUpdate(Integer hp){
System.out.println("收到hp变化为:" + hp);
}
public void onMpUpdate(Integer mp){
System.out.println("收到mp变化为:" + mp);
}
}
测试
public class EventDemo {
public static void main(String[] args) throws InterruptedException {
Player player = new Player();
player.setGold(1000);
player.setHp(800);
player.setMp(600);
player.iNotUseEvent();
}
}