今天編程時,突然想起來在一些異步操作或Android原生庫的時候,需要我們實現一些方法,
這些方法只需要我們具體實現,然后他們會在適當的時候,自動被調用!
例如AsyncTask,執行玩doInBackground()后會執行處理結果的postResult()方法,但我們並沒有設置過他們的執行順序。
以前只知道他們的運行原理,但不知道具體的實現方法,細想起來,這是一個相當不錯的代碼設計,所以決定研究一下。
因為一開始是通過實現方法來具體實現那些需要被執行的方法的,所以以為實現的方式是接口,
思索很久,依然沒想到接口里面如何設置方法的運行順序,搜索發現沒有相關的結果,只好去看下AsyncTask的源碼,希望從源碼中得到答案!
而源碼相當簡潔有力,直接給出了我想要的答案:實現方法被調用的順序控制,不是通過接口來實現的,而是通過抽象類!
而具體控制程序方法的調用順序的實現,就是在固定的方法里控制:例如AsyncTask的execute(具體的實現過程可以自己在IDE里面輕松查看,就不去具體剖析了)
以下是本人模仿的示例代碼,用於打印一個字符串數組的所有內容:
public class interface { public static void main(String[] args){ String[] b = {"a","b","c","d","e","f","g","h","i","j"}; new Order(b) { @Override protected String onFirst(String s) { System.out.println(s); return null; } @Override protected String onNext(String s) { System.out.println(s); return null; } @Override protected void onCompleted(String s) { System.out.println(s); } }.start(); } } //具體實現方法順序調用的抽象類 abstract class Order{ private String[] a; private int i = 0; public Order(String[] s){ this.a = s; } //這個抽象對象通過本方法啟動,而控制程序方法調用的具體過程就是從這里開始 public String[] start(){ onFirst(a[i++]); executor(); return a; } public void executor(){ //最后一個需要在完成時執行,也可以讓next方法執行完后再去執行Completed方法 while(i < a.length-2 && a[i] != null){ a[i++] = onNext(a[i]); } //返回字符串數組的最后一個元素內容 onCompleted(a[a.length-1]); } //下面這三個方法就是用來在新建對象時實現的方法,而我只想實現方法按照順序調用,就簡單地給出對應順序的字符串 //如果想要實現更復雜的功能,原理相同,具體問題具體分析 protected abstract String onFirst(String s); protected abstract String onNext(String s); protected abstract void onCompleted(String s); }