テンプレートモードとメソッドコールバックおよびオブザーバーモードの違い

テンプレートモード

https://blog.csdn.net/ezconn/article/details/108812616を参照してください

オブザーバーモード

参照https://blog.csdn.net/ezconn/article/details/108564814

メソッドコールバックまたはコールバック関数

コールバックは双方向の呼び出し関係です。AクラスHはクラスBに事前に登録された関数であり、クラスAはMクラスB関数時間を呼び出し、次にBクラスAクラスH関数を呼び出しますここでのH関数は「コールバック関数」です。AがBを呼び出し、次にBがAを呼び出します。この呼び出しメカニズムは「コールバック」と呼ばれます。

Javaコードで表現

public interface ICallback {
    void onCallback();
}

public class BClass {
    public void setCallback(ICallback callback) {
        //...
        callback.onCallback();
        //...
    }
}

public class AClass {
    public static void main(String[] args) {
        BClass b = new BClass();
        b.setCallback(new ICallback() { //回调对象
            @Override
            public void onCallback() {//回调方法
                System.out.println("Call back me.");
            }
        });
    }
}

同期コールバックと非同期コールバック

コールバックは、同期コールコールと非同期コールバック(または遅延コールバック)に分けることができます。同期コールバックとは、関数が戻る前のコールバック関数の実行を指します。非同期コールバックとは、関数が戻った後のコールバック関数の実行を指します。上記のコードは、実際には同期コールバックの実装です。setCallback()関数が戻る前に、コールバック関数onCallback()が実行されます。非同期コールバックの例:支払い機能はサードパーティの支払いシステムを介して実現されます。ユーザーが支払い要求を開始した後、ユーザーは通常、支払い結果が返されるまでブロックしません。代わりに、コールバックインターフェイスがサードパーティの支払いシステムに登録されます。結果は、コールバックインターフェイスを介して呼び出し元に返されます。

非同期コールバック

Androidでクリックイベントをリッスンすることを使用する必要があります。対話は通常、イベントの監視と切り離せません。

new Button(this).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("点击了按钮");
            }
});

コード構造の観点からは、イベントリスナーはコールバックのようなものです。つまり、コールバック関数(onClick())を含むオブジェクトが別の関数に渡されます。アプリケーションシナリオからは、オブザーバーモードと非常によく似ています。つまり、オブザーバー(OnClickListener)が事前に登録され、ユーザーがボタンをクリックすると、クリックイベントがオブザーバーに送信され、対応するonClick()関数が実行されます。ここでのコールバックは次のとおりです。非同期コールバック。コールバック関数をsetOnClickListener()関数に登録した後、コールバック関数が実行されるのを待つ必要はありません。

アプリケーションシナリオの観点からは、同期コールバックはテンプレートモードのように見え、非同期コールバックはオブザーバーモードのように見えます。

コード実装の観点から、コールバックモードとテンプレートモードは完全に異なります。コールバックは構成関係に基づいて実装されます。あるオブジェクトから別のオブジェクトへの受け渡しはオブジェクト間の関係です。テンプレートモードは継承関係に基づいて実装されます。サブクラスは、クラス間の関係である親クラスの抽象メソッドをオーバーライドします。 。

 

おすすめ

転載: blog.csdn.net/ezconn/article/details/108817097