GoF設計モード)Template Method Pattern

3103 ワード

意図する


  • オブジェクトの演算はアルゴリズムのスケルトンのみを定義し、各ステップの具体的な処理はサブクラスにプッシュされます.

  • 工場の方法モデルとよく似ています.
  • ファクトリメソッドモード

    動機。


    例は、
  • ファクトリメソッドと同じDocumentおよびApplication抽象クラスを含む.
  • に必要な処理手順を定義したOpenDocument()をテンプレートメソッド
  • と呼ぶ.
  • OpenDocument()で実際に実行される演算の実装は、アプリケーションクラスを継承するサブクラスが担当する.
  • 使いやすさ

  • アルゴリズムの不変の部分を定義し、サブクラスで定義できる部分を保持したい場合、
  • サブクラス間の共通動作を抽出し、コードの重複を回避するために1つの共通クラスに集中する場合、
  • .
  • サブクラスの拡張を制御できます.(制限がある場合があります)
  • こうぞう



    参加者

  • AbstractClass(Application)
    定義アルゴリズム処理段階において
  • サブクラスが再定義により解く必要がある基本演算+アルゴリズムスケルトンに対応するテンプレートメソッド
  • を定義する.
  • ConcreteClass(MyApplication)
  • は基本演算を実現し、各サブクラスは異なるアルゴリズム処理ステップ
  • を実行する.

    コラボレーションメソッド


    ConcreteClassはAbstractClassによってアルゴリズムの不変の処理ステップを実現する.

    結果

  • コード再利用の基本技術.特に、クラス仮想化を実現するための重要なテクノロジーです.ライブラリで定義するクラスの共通部分を分離するための
  • 親は子供を呼ぶが、子供は親
  • を呼ぶことができない.
  • テンプレートメソッド複数のメソッドの1つを呼び出す
  • 具体的な操作
  • 抽象体演算
  • 基本演算(抽象演算)
  • 工場方法
  • Hook演算
  • インプリメンテーション

  • テンプレートメソッドによって呼び出される基本演算は、保護された
  • である.
  • テンプレートメソッド
  • を上書きできません.
  • 超調を必要とする基本演算は抽象的に実現された
  • である.
  • をカバーすべき基本演算は
  • を最小化することが望ましい.
  • の演算をDOで始まるように再定義する必要がある.
  • 私の実際の実施


  • 今日もPizzaの例を作ってみました.

  • AbstractPizzaClassを作りましたが、ピザの作り方はprepare、addTopping、add cheese、packageの4種類があります.

  • このうちaddToppingとadd Cheeseプロセスは,各分岐点が自分に見てもらいたいときにtemplate method Patternに依頼する.

  • AbstractPizzaClass
  • public abstract class AbstractPizzaClass {
        // protected 선언이 일반적
        protected abstract void doAddTopping();
    
        protected abstract void doAddCheese();
    
        private void preparePizza() {
            System.out.println("Prepare Pizza");
        }
    
        private void packagingPizza() {
            System.out.println("Packaging Pizza");
        }
    
        // Template Method. 큰 틀은 부모가 정해놓고, 세부 공정은 Concrete가 하도록 abstract class로 구현
        public void templateMethod() {
            preparePizza();
    
            addTopping();
            addCheese();
    
            packagingPizza();
        }
    
    }
    
  • SeoulPizzaClass
  • // 구체적인 행동(addTopping, addCheese 메소드만 정의하고 나머지는 부모에게 맡김) 
    public class SeoulPizzaClass extends AbstractPizzaClass {
        @Override
        protected void doAddTopping() {
            System.out.println("add Seoul Pizza Topping");
        }
    
        @Override
        protected void doAddCheese() {
            System.out.println("add Seoul Cheese Topping");
        }
    
    }
    

    総評

  • シリーズの方法Patternとよく似ていて、多くの人が使っている図案です.
  • の違いは、Template Method PatternがConcrete Classに動作を委任し、Factory Method Patternが生成製品を委任することである.
  • 実際には、デザインパターンを知らなくても、みんなが開発している間についつい使ってしまいます.何を意味するのかを厳密に区別し、すぐにデザインパターンを思い出したいなら、具体的な違いを正確に理解する必要があります.