『Androidソースデザインモデル解析と実戦』読書ノート(十五)


第十五章、テンプレート方法パターン
テンプレートメソッドモードは構造が最も簡単な動作型設計モードであり、すべてのモードで最も一般的ないくつかのモードの一つでもあり、継承されたコード多重化に基づく基本技術である.その構造には、親と子の間の継承関係のみが存在します.
1.定義
操作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延させ、サブクラスがアルゴリズムの構造を変更せずにアルゴリズムの特定のステップを再定義できるようにします.
2.テンプレートメソッドモードでのメソッド
1.テンプレートの方法
1つのテンプレートメソッドは抽象クラスに定義され、基本的な操作メソッドを組み合わせて1つのどうにか法または1つの総行為を形成する方法である.このテンプレートメソッドは抽象クラスに定義され,サブクラスによって修正されずに完全に継承される.したがって、テンプレートメソッドの多くはfinalタイプとして定義され、主要な論理機能がサブクラスで書き換えられないことを示します.テンプレートメソッドは、最上位の論理フレームワークを与える特定のメソッドであり、論理の構成ステップは抽象クラスで特定のメソッドであっても抽象メソッドであってもよい.テンプレートメソッドは特定のメソッドであるため、テンプレートメソッドモードの抽象層はインタフェースではなく抽象クラスにすぎない.
2.基本的な方法
(1)抽象メソッド:抽象メソッドは抽象クラスによって宣言され、特定のサブクラスによって実現される.Java言語で抽象的な方法はabstractキーワードで表示されます.
(2)フックメソッド:抽象クラスによって宣言され実装され、サブクラスが拡張されます.サブクラスは,フックメソッドを拡張することによってテンプレートメソッドの論理に影響を及ぼすことができる.
3.シーンの使用
(1)複数のサブクラスには共通の方法があり,論理はほぼ同じである.
(2)重要で複雑なアルゴリズムは,コアアルゴリズムをテンプレート法として設計することができ,周辺の関連細部機能は各サブクラスによって実現される.
(3)再構成の場合,テンプレートメソッドはよく用いられるパターンであり,同じコードを親クラスに抽出し,フックメソッドでその挙動を制約する.
4.シンプルな実装
コンピュータの起動を例にとると、現在2台のコンピュータ、1台のWindowsシステムコンピュータ、1台のMacシステムコンピュータがあると仮定します.しかし、起動プロセスはほぼ一致しています.手順は電源をオンにし、システムをチェックし、システムをロードし、ログインする必要があるかどうかを確認します.
抽象的なコンピュータ
/** *     Computer */
public abstract class AbstractComputer {
    //       ,      ,             ,   protected
    /** *      */
    protected abstract void powerOn();

    /** *      */
    protected abstract void checkHardware();

    /** *        */
    protected abstract void loadOS();

    /** *    */
    protected abstract void login();

    //       ,     
    /** *        * * @return true      */
    protected boolean isLogin(){
        return true;
    }

    //       ,   final,          
    /** *        ,       、    、    、      。 */
    public final void startUp(){
        System.out.println("--------   START--------");
        powerOn();
        checkHardware();
        loadOS();
        if(isLogin()){
            login();
        }
        System.out.println("--------    END --------");
    }

}

Windowsシステムコンピュータ(ログイン不要):
/** * Windows     */
public class WindowsComputer extends AbstractComputer{

    @Override
    protected void powerOn() {
        System.out.println("Windows      ");
    }

    @Override
    protected void checkHardware() {
        System.out.println("Windows      ");
    }

    @Override
    protected void loadOS() {
        System.out.println("Windows        ");
    }

    @Override
    protected void login() {

    }

    @Override
    protected boolean isLogin() {
        return false;//  false,    
    }

}

Macシステムコンピュータ(登録が必要):
/** * Mac     */
public class MacComputer extends AbstractComputer{

    @Override
    protected void powerOn() {
        System.out.println("Mac      ");
    }

    @Override
    protected void checkHardware() {
        System.out.println("Mac      ");
    }

    @Override
    protected void loadOS() {
        System.out.println("Mac        ");
    }

    @Override
    protected void login() {
        System.out.println("Mac    ");
    }

}

呼び出し:
public class Client {
    public static void main(String[] args) {
        AbstractComputer comp = new WindowsComputer();
        comp.startUp();

        comp = new MacComputer();
        comp.startUp();
    }
}

結果:
--------   START--------
Windows      
Windows      
Windows        
--------    END --------
--------   START--------
Mac      
Mac      
Mac        
Mac    
--------    END --------

5.Androidソースのテンプレートメソッドモード
1.AsyncTask
AsyncTaskを使用する場合、doInBackground(Params...params)に時間のかかる操作を配置することはよく知られています.doInBackgroundの前に初期化操作をしたい場合は、onPreExecuteに実装を書くことができます.doInBackgroundの実行が完了するとonPostExecuteメソッドが実行されますが、AsyncTaskオブジェクトを構築し、executeメソッドを実行するだけです.
2.Activityのライフサイクル
Activity Threadのmain関数が呼び出されると、ActivityのonCreate、onStart、onResume関数が順次実行され、ユーザーは通常ActivityのサブクラスにonCreateメソッドを上書きし、このメソッドでsetContentViewを呼び出してレイアウトを設定します.
6.違い
(1)ファクトリメソッドはテンプレートメソッドの特殊なバージョンである.
(2)ポリシーモードとテンプレートメソッドモードはいずれもパッケージングアルゴリズムであり,1つは組合せ,1つは継承である.
(3)ポリシーモードとテンプレートモードは、通常、互いに置き換えることができる.これらはすべて試験用紙のようで、ポリシーモードは選択問題で、テンプレートモードは空の問題を記入します.
7.まとめ
テンプレートメソッドモードは4文字で要約すると,フローパッケージである.すなわち、固定されたプロセスをfinalメソッドにカプセル化し、サブクラスがこのプロセスのいくつかまたはすべてのステップをカスタマイズできるようにすることで、親クラスが共通のコードを抽出し、コードの多重化率を向上させ、拡張性を向上させる必要があります.
1.メリット
(1)パッケージング不変部,拡張可変部.
(2)共通部分コードを抽出し,メンテナンスが容易である.
2.短所
各基本メソッドの異なる実装にサブクラスを提供する必要があります.親クラスに可変な基本メソッドが多すぎると、クラスの個数が増加し、システムがより膨大になり、設計もより抽象的になります.この場合、ブリッジモードと組み合わせて設計することができます.
8.参考
1.テンプレート方法モード(Head first設計モード——7)
2.テンプレートメソッドパターン