設計モードせっけいもーど:テンプレートメソッドモードもーどほうしきもーど


定義#テイギ#
テンプレートメソッドモード:操作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延します.サブクラスがアルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義できるようにする.
Template Method Pattern :Define the skeleton of an algorithm in a operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
 
メリットとデメリット
メリット:
  • パッケージ不変部分、拡張可変部分
  • 共通部分コードを抽出し、
  • のメンテナンスを容易にする.
  • 動作は親によって制御され、子は
  • を実現する.
    欠点:
    一般的な設計習慣に従って、抽象クラスは最も抽象的で、最も一般的な事物属性と方法を宣言し、クラスが具体的な事物属性と方法を完成することを実現する.しかし、テンプレートメソッドモードは逆転し、抽象クラスは一部の抽象メソッドを定義し、サブクラスによって実現され、サブクラスの実行構造は親クラスの結果に影響し、つまりサブクラスは親クラスに影響を与え、コード読書の難易度を高めた.
     
    シーンの操作
  • 複数のサブクラスには共通の方法があり、論理はほぼ同じ
  • である.
  • 重要で複雑なアルゴリズムは、コアアルゴリズムをテンプレート方法として設計することができ、周辺の関連詳細機能は各サブクラスによって
  • を実現する.
  • 再構成の場合、同じコードを親クラスに抽出し、フック関数によってその動作
  • を拘束する.
    実装方法
    親クラスを抽象クラスとして定義し、抽象テンプレートと呼ばれます.定義方法は、2つに分けられます.
    基本メソッド:サブクラスによって実装され、テンプレートメソッドで呼び出されます.
    テンプレートメソッド:1つまたはいくつか、一般的には1つの具体的なメソッド、すなわち1つのフレームワークであり、基本的なメソッドのスケジューリングを実現し、固定的な論理を完成する.
     
    具体的な実装
    抽象テンプレート
    public abstract class HummerModel {
     
        //    
        protected abstract void start();
     
        protected abstract void stop();
     
        protected abstract void alarm();
     
        protected abstract void engineBoom();
     
        //    ,     final   ,     ,      
        final public void run() {
            this.start();
            this.engineBoom();
            if (this.isAlarm()) {
                this.alarm();
            }
            this.stop();
        }
     
        //    
        protected boolean isAlarm() {
            return true;
        }
    }

    サブクラス1:親のフックメソッドを上書きし、親の実行結果を逆制御
    public class HummerH1Model extends HummerModel {
     
        boolean alarmFlag = true;
     
        @Override
        protected void start() {
            System.out.println("H1 start!");
        }
     
        @Override
        protected void stop() {
            System.out.println("H1 stop!");
        }
     
        @Override
        protected void alarm() {
            System.out.println("H1 alarm!");
        }
     
        @Override
        protected void engineBoom() {
            System.out.println("H1 engineBoom!");
        }
     
        @Override
        protected boolean isAlarm() {
            return this.alarmFlag;
        }
     
        public void setAlarm(boolean isAlarm) {
            this.alarmFlag = isAlarm;
        }
    }

    サブクラス2:親フックメソッドを上書きし、親の実行結果を指定します.
    public class HummerH2Model extends HummerModel {
     
        @Override
        protected void start() {
            System.out.println("H2 start!");
        }
     
        @Override
        protected void stop() {
            System.out.println("H2 stop!");
        }
     
        @Override
        protected void alarm() {
            System.out.println("H2 alarm!");
        }
     
        @Override
        protected void engineBoom() {
            System.out.println("H2 engineBoom!");
        }
     
        @Override
        protected boolean isAlarm() {
            return false;
        }
    }

    サブクラス3:フックメソッドを上書きせず、親の実行結果を保持
    public class HummerH3Model extends HummerModel {
     
        @Override
        protected void start() {
            System.out.println("H3 start!");
        }
     
        @Override
        protected void stop() {
            System.out.println("H3 stop!");
        }
     
        @Override
        protected void alarm() {
            System.out.println("H3 alarm!");
        }
     
        @Override
        protected void engineBoom() {
            System.out.println("H3 engineBoom!");
        }
    }

    シーンクラス
    public class CLient {
     
        public static void main(String[] args) {
            HummerH1Model h1 = new HummerH1Model();
    //        h1.setAlarm(true);
            h1.setAlarm(false);
            h1.run();
            HummerH2Model h2 = new HummerH2Model();
            h2.run();
            HummerH3Model h3 = new HummerH3Model();
            h3.run();
        }
    }

    参考内容:
    『デザインモードの禅』秦小波