日期:2014-05-20  浏览次数:20588 次

Java 类之间的通信
Java有没有一种类似于C#的委托机制,比如
A类中的某个函数执行过程中,触发一个事件,这个事件能通知B类中的某个方法去执行,通过这样的方法去实现A类和B类之间数据的传递??
求大牛,解答,谢谢~~~~
最好给个例子~~~~

------解决方案--------------------
看了一下C#的委托,有点像java中的接口。
你说的这种情况,搞得像模像样点,可以这么做
Java code

public interface EventHandler {
    void execute(String event,Object... parameters);
}

public class EventContext {
    private static Map<String, Set<EventHandler>> EVENT_HANDLER_REGISTER = new HashMap<String, Set<EventHandler>>();

    public static void fireEvent(String event, Object... parameters) {
        Set<EventHandler> handlers = EVENT_HANDLER_REGISTER.get(event);
        if (handlers != null) {
            for (EventHandler handler : handlers) {
                handler.execute(event, parameters);
            }
        }
    }

    public static void registerEventHandler(String event, EventHandler handler) {
        Set<EventHandler> handlers = EVENT_HANDLER_REGISTER.get(event);
        if (handlers == null) {
            handlers = new HashSet<EventHandler>();
            EVENT_HANDLER_REGISTER.put(event, handlers);
        }
        handlers.add(handler);
    }

    public static Set<EventHandler> getEventHandlers(String event) {
        return EVENT_HANDLER_REGISTER.get(event);
    }
}

public class A {
    void doSomething(){
        //do something
        EventContext.fireEvent("somethingDone","some value from A");
    }
}

public class B implements EventHandler {
    @Override
    public void execute(String event,Object... parameters) {
        System.out.println("I'm running with "+ parameters[0]);
    }
}

public class Test {
    public static void main(String[] args) {
        A a=new A();
        B b=new B();
        EventContext.registerEventHandler("somethingDone",b);
        a.doSomething();
    }
}

------解决方案--------------------
簡單點就是觀察者模式,給一個簡單的sample
Java code
interface Observer{
    void ChangeEvent();
}

class A{
    private Observer ob;
    A(){
        ob = null;
    }
    void SetObserver(Observer ob){
        this.ob = ob;
    }
    void InvokeB(){
        if (ob != null)
            ob.ChangeEvent();
    }
}

class B implements Observer{
    public void ChangeEvent(){
        System.out.println("B is invoked");
    }
}

public class ObserverTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        A a = new A();
        a.SetObserver(new B());
        a.InvokeB();
    }

}