天天看點

匿名内部類、回調、和事件驅動

一、内部類的作用域:

(1)、一個内部類的對象能夠通路建立它的對象的實作,包括私有資料。

(2)、内部類對于同一個包中的其它類來說,内部類能夠被隐藏起來。内部類不管方法的可見性如何,哪怕是public 的其它類都無法使用它。

(3)、内部類對象通過‘外部類名.this.xxx’的形式通路外部類的屬性與方法。

(4)、外部類可以直接使用内部類的對象。

        pouter po = new pouter();

        pouter.pinner pi = po.new pinner();

        pi.Print();

二、java回調機制:

軟體子產品之間總是存在着一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。

同步調用:一種阻塞式調用,調用方要等待對方執行完畢才傳回,它是一種單向調用;

回 調:一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;

異步調用:一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。

回調和異步調用的關系非常緊密:使用回調來實作異步消息的注冊,通過異步調用來實作消息的通知。

回調函數:有點像您随身帶的BP機:告訴别人号碼,在它有事情時Call您

回調用于層間協作,回調就是該函數寫在高層,低層通過一個函數指針儲存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。

應用:在Java中,通常就是編寫另外一個類或類庫的人規定一個接口,然後你來實作這個接口,然後把這個接口的一個對象作為參數傳給别人的程式,别人的程式必要時就會通過那個接口來調用你編寫的函數。

eg:

ExecutorService pool = Executors.newFixedThreadPool(2);  //線程池
  for (int i = 0; i < files.size(); i++) {
   final File file = (File) files.get(i);
   pool.execute(new Runnable() {
    public void run() {
           doSomething();    }
   });
  }
  pool.shutdown();      

JDK 定義了一個接口  Runnable,我實作了這個接口的方法,然後又把這個接口的引用傳遞給JDK。

1)、定義回調函數接口
public interface CallBack(){
      public void execute();
}
 
2)、定義外部類實作方法
OutClass:
pubic void testOut(CallBack callBack){
      ...........
       callBack.execute();   //(屬于底層調用)
      ...........
 
}
 
public void main(String[] args){
     OutClass out = new OutClass();
     out.testOut(new CallBack(){
               public void execute(){
                    //我需要實作的東西,(屬于高層實作)
               }
     });
}      
eg:
定義事件接口
public interface Event{
     public void  interEvent();
}
 
定義兩個具體事件
public class PrintEvent implements Event{
     public PrintEvent(){}
 
     public interEvent(){
              System.out.println("發生了列印事件");
    }
}
 
public class QueryEvent implements Event{
     public QueryEvent(){}
 
     public interEvent(){
              System.out.println("發生了查詢事件");
    }
}
 
定義螢幕
public class EventMonitor{
     private   Event e;
     private   boolean somHapp;
     public EventMonitor(){
           somHapp= true;
     }
     public setEvent(Event e){
             this.e = e
    }
    public void doWork(){
         if(somHapp){
              e.interEvent();
         }
   }
}
 
測試
public static void main(String[] args) {
   QueryEvent qe = new QueryEvent ();
   PrintEvent  pe = new PrintEvent ();
   EventMonitor em = new EventMonitor();
   em .setEvent(qe );
   em .doWork();
   em .setEvent(pe );
   em .doWork();
}