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();
}
}