JAVA設計方法思考之如何實現一個方法執行完畢后自動執行下一個方法


今天編程時,突然想起來在一些異步操作或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);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM