public class Event {
//要执行方法对象
private Object object;
//要执行的方法名
private String methodName;
//参数数组
private Object[] params;
//参数的参数类型
private Class[] paramTypes;
//省略getter/setter
//根据传入参数获取参数类型
private void contractParamTypes(Object[] params){
this.paramTypes = new Class[params.length];
for(int i = 0; i < params.length; i++){
this.paramTypes[i] = params[i].getClass();
}
}
public Event(Object object, String methodName, Object... args){
this.object = object;
this.methodName = methodName;
this.params = args;
contractParamTypes(this.params);
}
//利用java反射机制调用指定方法
public void invoke() throws Exception{
Method method = this.object.getClass().getMethod(this.methodName, this.paramTypes);
if(method == null){
return;
}
System.out.println("调用类" + object.getClass().getName() + "的方法" + methodName);
method.invoke(this.getObject(), this.getParams());
}
}
public class EventHandler {
private List<Event> events;
public EventHandler() {
events = new ArrayList<>();
}
public void registeEvent(Object object, String methodName, Object... args){
System.out.println("将类" + object.getClass().getName() + "委托给EventHandler");
this.events.add(new Event(object, methodName, args));
}
public void notifiy() throws Exception{
for(Event e : events){
e.invoke();
}
}
}
public abstract class NotifierAbstract {
private EventHandler eventHandler = new EventHandler();
public EventHandler getEventHandler() {
return eventHandler;
}
public void setEventHandler(EventHandler eventHandler) {
this.eventHandler = eventHandler;
}
//将具体实现注册到委托类中
public abstract void registeListener(Object object, String methodName, Object... args);
//唤起所有委托类中维护的具体实现
public abstract void notifyEvents();
}
public class NotifierImpl extends NotifierAbstract {
@Override
public void registeListener(Object object, String methodName, Object... args) {
System.out.println("有新的方法注册到委托类中了,实现类为:" + object.getClass().getName());
this.getEventHandler().registeEvent(object, methodName, args);
}
@Override
public void notifyEvents() {
System.out.println("唤起委托下的所有实现类!");
try {
this.getEventHandler().notifiy();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试用监听器,事件触发后,被委托的具体的处理方法所在的类
public class AListener {
public AListener(){
System.out.println("创建 A 类监听者");
}
public void operation(Date date){
System.out.println("A 类事件具体操作, 发生时间:" + date);
}
}
public class Main {
public static void main(String[] args) {
NotifierImpl notifier = new NotifierImpl();
AListener a = new AListener();
notifier.registeListener(a, "operation", new Date());
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
notifier.notifyEvents();
}
}