JAVA中的委託

  • 委託實現基礎類
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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章