大家好哇,我是梦辛工作室的灵,在最近的项目中发现各个模块之间的耦合比较严重,相互依赖,这容易导致后期的维护成本增加,且不能轻易修改,为此呢,自己为了方便就写了一个用于解耦的事件管理内,和JavaScript的EventListener差不多,下面来看下怎么使用的(支持多线程使用哦,里面做了线程保护的)
使用方法如下:
public static void main(String[] args) {
EventListenerManager eventListenerManager = EventListenerManager.getInstance();
EventRunnable runnable1 = new EventRunnable() {
@Override
public void run(JSONObject data) {
if (data != null) System.out.println("1:" + data.toString());
}
};
eventListenerManager.addEventListener("test",runnable1); //添加监听
JSONObject data = new JSONObject();
data.put("ceshi","你好啊");
eventListenerManager.emit("test",data); //提交事件
}
这样子就方便很多了吧,在需要的地方去emit 对应额事件和数据就可以了,事件的消费就可以在其他地方去 addEventListener 就可以,这样就可以减少 模块之间的耦合,从而使得代码更加的清晰,也可以减少工作之间的相互等待,不用等其他人员完成该模块工作,项目可以继续下去,下面来看下EventListenerManager 的源码,其实很简单:
package com.example.demo;
import net.sf.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class EventListenerManager {
private static EventListenerManager instance = null;
private ExecutorService threadPool = null;
private final int THREAD_COUNT = 3;
private EventListenerManager() {
threadPool = Executors.newFixedThreadPool(THREAD_COUNT);
managerMap = new ConcurrentHashMap<>();
}
private Map<String, EventRunableManager> managerMap = null;
public static EventListenerManager getInstance() {
if (null == instance) {
synchronized (EventListenerManager.class) {
if (null == instance) {
instance = new EventListenerManager();
}
}
}
return instance;
}
public boolean addEventListener(String event,EventRunnable runnable){
EventRunableManager runableManager = managerMap.get(event);
if(runableManager == null){
runableManager = new EventRunableManager();
}
boolean addResult = runableManager.add(runnable);
if (addResult)
managerMap.put(event,runableManager);
return addResult;
}
public boolean removeEventListener(String event,EventRunnable runnable){
EventRunableManager runableManager = managerMap.get(event);
if(runableManager == null){
return false;
}
boolean removeResult = runableManager.remove(runnable);
if(runableManager.size() == 0){
managerMap.remove(event);
}
return removeResult;
}
public void emit(String event){
final EventRunableManager runableManager = managerMap.get(event);
if(runableManager == null){
return;
}
threadPool.execute(new Runnable() {
@Override
public void run() {
runableManager.run(null);
}
});
}
public void emit(String event, JSONObject data){
final EventRunableManager runableManager = managerMap.get(event);
if(runableManager == null){
return;
}
threadPool.execute(new Runnable() {
@Override
public void run() {
runableManager.run(data);
}
});
}
interface EventRunnable{
void run(JSONObject data);
}
private class EventRunableManager {
private List<EventRunnable> runnableList = null;
private boolean run = false;
private final int MAX_WAIT_TIME = 15 * 1000; // 最长等待时间
EventRunableManager() {
runnableList = new ArrayList<>();
}
public synchronized boolean add(EventRunnable run) {
if(isRun()) {
try {
wait(MAX_WAIT_TIME);
} catch (InterruptedException e) {
return false;
}
}
runnableList.add(run);
return true;
}
public synchronized boolean remove(EventRunnable run) {
if(isRun()) {
try {
wait(MAX_WAIT_TIME);
} catch (InterruptedException e) {
return false;
}
}
runnableList.remove(run);
return true;
}
private boolean isRun() {
return run;
}
private void setRun(boolean run) {
this.run = run;
}
public int size(){
return runnableList.size();
}
public synchronized boolean run(JSONObject data) {
if(isRun()) {
try {
wait(MAX_WAIT_TIME);
} catch (InterruptedException e) {
return false;
}
}
try {
setRun(true);
for (EventRunnable itemRun:runnableList){
itemRun.run(data);
}
setRun(false);
} catch (Exception e){
return false;
} finally {
notify();
}
return true;
}
}
}
好了,今天的分享就到这里了,收工=-=