デザインパターン(23)テンプレートメソッドパターン

テンプレートメソッドパターン

1.テンプレートメソッドパターンとは

テンプレートメソッドパターン:動作中のアルゴリズムのフレームワークを定義し、サブクラスへのいくつかのステップを遅らせます。テンプレートメソッドパターンを使用すると、サブクラスは、アルゴリズムの構造を変更せずに、アルゴリズムの特定のステップを再定義できます。

テンプレートメソッドパターンは、継承に基づくコード再利用技術であり、一種の振る舞いパターンです。

テンプレートメソッドパターンは、最も単純なビヘイビアデザインパターンであり、その構造では、親クラスと子クラスの間に継承関係のみがあります。テンプレートメソッドパターンを使用することで、いくつかの複雑なプロセスの実装ステップを一連の基本メソッドにカプセル化できます。テンプレートメソッドと呼ばれるメソッドが抽象親クラスに提供され、これらの基本メソッドの実行順序とそのサブクラスを定義します。同じアルゴリズムフレームワークが異なる実行結果を持つことができるように、いくつかのステップをカバーするため。テンプレートメソッドパターンは、アルゴリズムフレームワークを定義するためのテンプレートメソッドを提供し、いくつかの特定のステップの実現は、そのサブクラスで完了することができます。

テンプレートメソッドモードでは、オブジェクト指向のポリモーフィズムにより、サブクラスオブジェクトは実行時に親クラスオブジェクトをオーバーライドし、サブクラスで定義されたメソッドは親クラスで定義されたメソッドもオーバーライドします。したがって、特定の子クラスのメソッドは親クラスで定義された基本メソッドをオーバーライドし、子クラスのフックメソッドも親クラスのフックメソッドをオーバーライドします。したがって、親クラスメソッドの実行はフックメソッドによって制限できます。子クラスに実装されます。クラスによる親クラスの動作の逆制御。

2.テンプレートメソッドパターンの役割分析

テンプレートメソッドモードの構造図:
テンプレートメソッドパターン

  • AbstractClass(抽象クラ​​ス):一連の基本操作(PrimitiveOperations)は、抽象クラスで定義されます。これらの基本操作は、具象または抽象にすることができます。各基本操作は、アルゴリズムのステップに対応し、サブクラスに再定義または実装できます。これらの手順。同時に、アルゴリズムのフレームワークを定義するために、テンプレートメソッド(テンプレートメソッド)が抽象クラスに実装されます。テンプレートメソッドは、抽象クラスに実装された基本メソッドを呼び出すだけでなく、抽象クラスに実装されたサブクラスを呼び出すこともできます。抽象クラス。基本的なメソッド。他のオブジェクトのメソッドを呼び出すこともできます。

  • ConcreteClass(concrete subclass):これは抽象クラスのサブクラスであり、親クラスで宣言された抽象基本操作を実装してサブクラス固有のアルゴリズムのステップを完了するために使用されます。また、実装された特定の基本操作をカバーすることもできます。親クラスで。

  • テンプレートメソッド
    テンプレートメソッドは、基本的な操作メソッドを組み合わせて一般的なアルゴリズムまたは一般的な動作を形成する抽象クラスで定義されたメソッドです。このテンプレートメソッドは抽象クラスで定義され、変更なしでサブクラスに完全に継承されます。テンプレートメソッドは、最上位の論理フレームワークを提供する具象メソッドであり、抽象クラスの論理構成ステップは、具象メソッドまたは抽象メソッドにすることができます。テンプレートメソッドは具象メソッドであるため、テンプレートメソッドパターンの抽象化レイヤーは、インターフェイスではなく、抽象クラスのみにすることができます。

  • 基本メソッド
    基本メソッドは、アルゴリズムのさまざまなステップを実装するメソッドであり、テンプレートメソッドの不可欠な部分です。
    基本的な方法は、抽象的方法、具体的方法、フック方法の3つのタイプに分けることができます。

    1. 抽象メソッド:抽象メソッドは、抽象クラスによって宣言され、その具象サブクラスによって実装されます。C#言語の抽象メソッドは、abstractキーワードで識別されます。
    2. 具象メソッド:具象メソッドは、抽象クラスまたは具象クラスによって宣言および実装され、そのサブクラスはオーバーライドまたは直接継承できます。
    3. フックメソッド:フックメソッドは、抽象クラスまたは具象クラスによって宣言および実装され、そのサブクラスは拡張できます。通常、親クラスで指定された実装は空の実装であり(virtualキーワードを使用して仮想関数として定義できます)、空の実装がメソッドのデフォルトの実装として使用されます。もちろん、hookメソッドは空でないデフォルトの実装。

一般に2つのフック方法があります:

  • 最初のタイプのフックメソッドは、いくつかの特定のステップで「フック」して、さまざまな条件下でテンプレートメソッドにさまざまなステップを実装できます。このタイプのフックメソッドの戻り値の型は通常ブール型であり、このタイプのメソッドの名前は次のとおりです。通常、IsXXX()は、特定の条件を判断するために使用されます。条件が満たされている場合は、特定のステップを実行します。そうでない場合、実行されません。
public void TemplateMethod() {
    
    
    Open();
    Display();
    //通过钩子方法来确定某步骤是否执行
    if (IsPrint()) {
    
    
      Print();
    }
}
 
//钩子方法,返回boolean值
protected bool IsPrint(){
    
    
    return true;
}
  • 別のタイプのフックメソッドは、実装本体が空の特定のメソッドです。サブクラスは、必要に応じてこれらのフックメソッドをオーバーライドまたは継承できます。
abstract class AbstractClass {
    
    
    //模板方法
    public void TemplateMethod() {
    
    
        PrimitiveOperation1();
        PrimitiveOperation2();
        PrimitiveOperation3();
    }
 
    //基本方法—具体方法
    public void PrimitiveOperation1() {
    
    
        //实现代码
    }
 
    //基本方法—抽象方法
    public abstract void PrimitiveOperation2();    
 
    //基本方法—钩子方法
    public virtual void PrimitiveOperation3()   {
    
    
    }
}

3.テンプレートメソッドパターンの長所と短所

利点:

  • アルゴリズムは親クラスで正式に定義され、そのサブクラスは詳細処理を実装します。サブクラスが詳細処理アルゴリズムを実装する場合、アルゴリズムのステップの実行順序は変更されません。
  • テンプレートメソッドパターンは、クラスライブラリの設計で特に重要なコード再利用テクノロジです。これは、クラスライブラリ内のパブリック動作を抽出し、パブリック動作を親クラスに配置し、そのサブクラスを介してさまざまな動作を実装します。継承を適切に使用して、コードの再利用を実現します。
  • 一種の逆制御構造を実現でき、サブクラスのフックメソッドが親クラスをオーバーライドして、特定のステップを実行する必要があるかどうかを判断します。
  • テンプレートメソッドパターンでは、親クラスの基本メソッドをサブクラスでオーバーライドできます。サブクラスが異なれば、基本メソッドの実装も異なります。新しいサブクラスを置き換えて追加し、単一責任の原則との原則に準拠すると便利です。開閉。

短所:
基本メソッドごとに異なる実装のサブクラスを提供する必要があります。親クラスに可変基本メソッドが多すぎると、クラスの数が増え、システムが大きくなり、設計がより抽象的になります。 。ブリッジモードと組み合わせて設計します。

該当するシーン:

  • いくつかの複雑なアルゴリズムをセグメント化するには、アルゴリズムの固定部分をテンプレートメソッドおよび親クラスの特定のメソッドとして設計し、変更可能な詳細の一部をそのサブクラスによって実装します。つまり、アルゴリズムの不変部分を一度に実装し、変数の動作をサブクラスに任せて実装します。
  • コードの重複を避けるために、各サブクラスの共通の動作を抽出して、共通の親クラスに集中させる必要があります。
  • 親クラスへのサブクラスの逆制御を実現するためには、親クラスのアルゴリズムのステップがサブクラスを介して実行されるかどうかを判断する必要があります。

4. 实操感想

頻繁に、非常に頻繁に使用されます。開発における親クラスの実現を制御する必要があり、すべての側面を考慮する必要があります。複数の親クラスに複数の子クラスがあるためです。

5.コード例

少し…

おすすめ

転載: blog.csdn.net/u014099894/article/details/85208649