JAvaコールバックメカニズムの実現

6599 ワード


    Javaのインタフェースサポートは,コールバックの等価機能を得るメカニズムを提供する.そのテクニックは、簡単なインタフェースを定義し、呼び出す方法を宣言することです.インスタンスがインタフェースの参照を持つことを特徴とします.
たとえば、ある時間に発生したときに通知を望んでいるとします.インタフェースを定義できます.
package com.wxy.callback;

public interface InterestingEvent {

    /**

     *        ,    ,      ,       

     */

    public void interestingEvent();

}

    これにより、インタフェースを実装するクラスを任意のオブジェクトに制御することができます.したがって、外部タイプの情報に関心を持つ必要はありません.イベント信号を送信するクラスは、InterestingEventインタフェースが実装されたオブジェクトを待機し、適切なタイミングでinterestingEvent()メソッドを呼び出す必要があります.
package com.wxy.callback;


public class EventNotifier {

    /**    */

    private  InterestingEvent ie;

    /**      */

    private boolean          somethingHappend;


    /**

     *     ,          

     * @param event     

     */

    public EventNotifier(InterestingEvent event) {

        this.ie = event;

        //       

        somethingHappend = false;

    }

    /**

     *     ,  InterestingEvent               

     */

    public void doWork() {

        //          

        if (somethingHappend) {

            //                 

            ie.interestingEvent();

        }

    } 

}
  EventNotifierでは、somethingHappend述語を使用してイベントがトリガーされるかどうかを追跡します.多くの場合、このメソッドを呼び出すと、interesthingEvent()への信号の送信を保証するのに十分です.イベント通知を受信するコードは、Interestingeventインタフェースを実装し、イベント通知プログラムに自身の参照を渡す必要があります.
public class CallMe implements InterestingEvent {

    private EventNotifier en;

    /**
     *         ,          
     */
    public CallMe() {
        this.en = new EventNotifier(this);
    }

    /**
     *             
     */
    @Override
    public void interestingEvent() {
        System.out.println("oh,something interesting has happended!");
        System.out.println("do some action!");
    }

    public EventNotifier getEn() {
        return en;
    }

    public void setEn(EventNotifier en) {
        this.en = en;
    }

}
    次は典型的なコールバックケースです.会社の従業員が仕事をし、仕事が終わった後、主管は従業員に仕事の完成状況を報告するように要求します.  イベントインタフェース:
package com.wxy.callback;

public interface Event {
    /**
     *         
     * @return     
     */
    public String happendEvent();

}
   イベント実装クラス:
package com.wxy.callback;

public class EventA implements Event {

    @Override
    public String happendEvent() {
        return "job has been finished!";
    }

}
 
package com.wxy.callback;

public class EventB implements Event {

    @Override
    public String happendEvent() {
        return "job has been finished!";
    }

}
 主管類:
package com.wxy.callback;

public class Boss {
    private String name;

    public Boss(String name) {
        this.name = name;
    }

    public void getStaffEvent(Staff staff, Event event) {
        System.out.println("the msg what the boss received is--" + staff.getName() + ":"
                           + event.happendEvent());
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
 従業員クラス:
package com.wxy.callback;

public class Staff {
    private Event  event; //  
    private String name; //    
    private Boss   boss; //      

    /**
     *        
     * @param name     
     * @param boss   Boss  ,          
     */
    public Staff(String name, Boss boss) {
        this.name = name;
        this.boss = boss;
    }

    public void doWork() {
        System.out.println(name + " is doing working...");
        //do somtething.....
        for (int i = 0; i < 10; i++) {
            System.out.println("sheep" + i);
        }
        System.out.println(name + " was finished work!");
        //tell the boss what has happend,    boss     
        boss.getStaffEvent(this, event);
    }

    public Event getEvent() {
        return event;
    }

    public void setEvent(Event event) {
        this.event = event;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boss getBoss() {
        return boss;
    }

    public void setBoss(Boss boss) {
        this.boss = boss;
    }

}
 テストクラス:
package com.wxy.callback;

public class StaffBossTest {
    public static void main(String args[]) {
        //        
        Boss boss = new Boss("boss");
        Staff staffA = new Staff("staffA", boss);
        Staff staffB = new Staff("staffB", boss);

        //          
        Event event1 = new EventA();
        Event event2 = new EventB();

        //          
        staffA.setEvent(event1);
        staffB.setEvent(event2);

        //     ,           
        staffA.doWork();
        staffB.doWork();
    }
}
 テスト結果:
staffA was finished work!
the msg what the boss received is--staffA:job has been finished!
staffB is doing working...
sheep0
sheep1
sheep2
sheep3
sheep4
sheep5
sheep6
sheep7
sheep8
sheep9
staffB was finished work!
the msg what the boss received is--staffB:job has been finished!
 従業員が作業を完了すると(イベントがトリガーされると)、staffオブジェクトがbossオブジェクトを呼び出す方法でコールバック機能が実現されることがわかります.設計モードでは,観察者モードも典型的なコールバック機構の適用例である.