回撥函式透徹理解Java

yangxi_001發表於2014-09-24

回撥函式,第一次見是在Java程式設計思想中,以及後來的觀察者模式也應用了回撥函式的思想。但是一直都沒有重視,終於在一次面試的時候吃虧了,越來越理解為什麼很多人說Java程式設計思想這本書要一遍遍的看,吃透!

        首先在網路上搜尋很多文章介紹什麼是回撥函式,看的雲裡霧裡的。後來自己一步步分解終於理解了,記錄如下。

        從維基百科上面摘抄定義:(看完本篇文章再來理解這個定義)

        計算機程式設計中,回撥函式,或簡稱回撥,是指通過函式引數傳遞到其它程式碼的,某一塊可執行程式碼引用。這一設計允許了底層程式碼呼叫在高層定義的子程式

        在Java裡面,我們使用介面來實現回撥。

        這篇文章中的解說定義非常好:http://blog.csdn.net/sweetwxh/article/details/2067139

        所謂的回撥,就是程式設計師A寫了一段程式(程式a),其中預留有回撥函式介面,並封裝好了該程式。程式設計師B要讓a呼叫自己的程式b中的一個方法,於是,他通過a中的介面回撥自己b中的方法。下面是例子。

      1.  首先定義一個類Caller,按照上面的定義就是程式設計師A寫的程式a,這個類裡面儲存一個介面引用。

      

[java] view plaincopy
  1. public class Caller {  
  2.     private MyCallInterface callInterface;  
  3.       
  4.     public Caller() {  
  5.     }  
  6.       
  7.     public void setCallFunc(MyCallInterface callInterface) {  
  8.         this.callInterface = callInterface;  
  9.     }  
  10.       
  11.     public void call() {  
  12.         callInterface.printName();  
  13.     }  
  14. }  


       2.  當然需要介面的定義,為了方便程式設計師B根據我的定義編寫程式實現介面。

  

[java] view plaincopy
  1. public interface MyCallInterface {  
  2.     public void  printName();  
  3. }  


      3.  第三是定義程式設計師B寫的程式b

[java] view plaincopy
  1. public class Client implements MyCallInterface {  
  2.   
  3.     @Override  
  4.     public void printName() {  
  5.         System.out.println("This is the client printName method");  
  6.     }  
  7. }  


       4.  測試如下

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Caller caller = new Caller();  
  4.         caller.setCallFunc(new Client());  
  5.         caller.call();  
  6.     }  
  7. }  


      看到這裡應該明白什麼是回撥了,有些文章介紹的很好,但是剛開始沒看明白,是因為把第3步的類省略,直接寫成匿名類了。

        5.  在測試方法中直接使用匿名類,省去第3步。

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Caller caller = new Caller();  
  4. //      caller.setCallFunc(new Client());  
  5.         caller.setCallFunc(new MyCallInterface() {  
  6.             public void printName() {  
  7.                 System.out.println("This is the client printName method");  
  8.             }  
  9.         });  
  10.         caller.call();  
  11.     }  
  12. }  


      看完了上面的文章,直接看下面這篇文章:http://kidult.iteye.com/blog/148982

      以上就是回撥函式的全部理解。

相關文章