java介面回撥

百聯達發表於2016-11-28
一:回撥的用途

回撥一般用於層間協作,上層將本層函式安裝在下層,這個函式就是回撥,而下層在一定條件下觸發回撥。例如作為一個驅動,是一個底層,他在收到一個資料時,除了完成本層的處理工作外,還將進行回撥,將這個資料交給上層應用層來做進一步處理,這在分層的資料通訊中很普遍。

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

二:JAVA實現介面回撥


1.回撥介面


點選(此處)摺疊或開啟

  1. public interface CallbackInterface {

  2.     public void callbackMethod();
  3. }



2.介面引用

點選(此處)摺疊或開啟

  1. public class Caller {

  2.     public CallbackInterface callback;

  3.     /**
  4.      * @param callback
  5.      * the callback to set
  6.      */
  7.     public void setCallback(CallbackInterface callback) {
  8.         this.callback = callback;
  9.     }

  10.     public void call() {
  11.         this.callback.callbackMethod();
  12.     }

  13. }
3.介面回撥類

點選(此處)摺疊或開啟

  1. public class Client implements CallbackInterface{

  2.     /* (non-Javadoc)
  3.      * @see com.enjoylink.gmap.mongodb.demo.CallbackInterface#callbackMethod()
  4.      */
  5.     @Override
  6.     public void callbackMethod() {
  7.         
  8.         System.out.println("this is the client callbackMethod.");
  9.     }

  10. }

4.測試類

點選(此處)摺疊或開啟

  1. public class CallbackTest {

  2.     public static void main(String[] args) {

  3.         Caller caller = new Caller();
  4.         // Client client = new Client();
  5.         // caller.setCallback(client);
  6.         caller.setCallback(new CallbackInterface() {
  7.             @Override
  8.             public void callbackMethod() {
  9.                 System.out.println("匿名類回撥");
  10.             }
  11.         });
  12.         caller.call();
  13.     }
  14. }

三:Spring JdbcTemplate中的回撥例項

對於spring的JdbcTemplate進行結果集查詢操作,spring給我們開發的是一系列的query方法,這些查詢的方法中回撥的介面主有三種:ResultSetExtractorRowCallbackHandlerRowMapper這個內容有圖有真相:



1. ResultSetExtractor 

點選(此處)摺疊或開啟

  1. public interface ResultSetExtractor {
  2.        Object extractData(ResultSet rs) throws SQLException,
  3.                                                 DataAccessException;
  4.     }

點選(此處)摺疊或開啟

  1. List<User> userList = (List<User>)jdbcDao.getJdbcTemplate().
  2.                                    query("select * from T_USER", new ResultSetExtractor() {
  3.             @Override
  4.             public Object extractData(ResultSet rs) throws SQLException,
  5.                                                             DataAccessException {
  6.                  List<User> userList = new ArrayList<User>();
  7.                  while (rs.next()) {
  8.                     User user = new User();
  9.                     user.setId(rs.getInt("N_ID"));
  10.                     user.setName(rs.getString("C_NAME"));
  11.                     userList.add(user);
  12.                  }
  13.                  return userList;
  14.             }
  15.     });
2.RowCallbackHandler

點選(此處)摺疊或開啟

  1. public interface RowCallbackHandler {
  2.            void processRow(ResultSet rs) throws SQLException;

  3.      }

點選(此處)摺疊或開啟

  1. final List<User> userList = new ArrayList<User>();
  2.   jdbcDao.getJdbcTemplate().query("select * from T_USER",
  3.                                                      new RowCallbackHandler(){
  4.        @Override
  5.        public void processRow(ResultSet rs) throws SQLException {
  6.            User user = new User();
  7.            user.setId(rs.getInt("N_ID"));
  8.            user.setName(rs.getString("C_NAME"));
  9.            userList.add(user);
  10.        }
  11.    });
3.RowMapper


點選(此處)摺疊或開啟

  1. public interface RowMapper {
  2.      Object mapRow(ResultSet rs, int rowNum) throws SQLException;
  3. }


點選(此處)摺疊或開啟

  1. List<User> userList = (List<User>)jdbcDao.getJdbcTemplate().
  2. query("select * from T_USER", new RowMapper(){
  3.             @Override
  4.             public Object mapRow(ResultSet rs, int rowNumber)
  5. throws SQLException {
  6.                 User user = new User();
  7.                 user.setId(rs.getInt("N_ID"));
  8.                 user.setName(rs.getString("C_NAME"));
  9.                 return user;
  10.             }
  11.       });

四:Android中的介面回撥

在android中回撥機制被大量的使用。比如,在Activity中定義了很多生命週期的不同狀態要呼叫的方法,這些方法都是空實現,系統框架要呼叫,使用者也要呼叫來實現。

舉個簡單的例子就是Button的點選響應事件實現機制


點選(此處)摺疊或開啟

  1. button.setOnClickListener(new OnClickListener()
  2.         {
  3.             @Override
  4.             public void onClick(View v)
  5.             {

  6.             }
  7.         });
OnClickListener就是android系統所約好的介面,然後在我們寫的應用程式中傳入回撥物件,這樣就可以達到介面統一,實現不同的效果。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2129241/,如需轉載,請註明出處,否則將追究法律責任。

相關文章