テンプレート方法モード(Template Method Pattern)

6656 ワード

意図
一つの方法では、アルゴリズムの骨格を定義し、いくつかのステップをサブクラスに遅延させる.テンプレート方法は、アルゴリズム構造を変えずに、アルゴリズム中のいくつかのステップを再定義できるようにする.
動機
システムを設計する際に、アルゴリズムに必要なキーステップを明確にし、これらのステップの実行順序を決定したが、いくつかのステップの具体的な実装はまだ未知であるか、または特定の環境に依存する必要がある.明確なアルゴリズムステップは親クラスでテンプレート方法として定義でき、未知の具体的な実装部分はサブクラスに遅延して実装される.
適用性
テンプレート方法モードは、通常、以下のシーンに適用される.
  • アルゴリズムの全体的なステップは固定されていますが、一部の部分が変わりやすい場合は、テンプレートの方法モードを使用して、容易に変化する部分を抽象化して、サブクラスで実現できます.
  • は、複数のサブクラスが共通の動作をしている場合、コードの重複を回避するために、1つの共通の親クラスに抽出して統合することができる.まず、既存のコードの違いを識別し、異なる点を新たな動作に分離します.最後に、これらの新しい動作を呼び出すテンプレート方法でこれらの異なるコードを置換します.
  • サブクラスの拡張を制御する必要がある場合、テンプレート方法は、特定のポイントでのみフック動作を起動し、これらの点でのみ拡張が可能になる.
  • 構造
    テンプレートの方法の主要な役割は以下の通りです.
  • 抽象クラス(AbstractClass):テンプレート方法を定義し、アルゴリズムの輪郭と骨格を与える.テンプレート法といくつかの基本的な方法で構成されています.
  • 具体的なサブクラス(Cocrete Class):親クラスで定義された抽象的な方法を実現し、フック方法を選択的に実現する.
  • 実現する
    //    
    public abstract class AbstractClass {
    	//     ,           ,           
    	public void templateMethod() {
    		hookMethod();
    		primitiveoperationA();
    		primitiveoperationB();
    
    	}
    
    	//     ,                
    	public void hookMethod() {
    		System.out.println("    , (   )  ,           。");
    	}
    
    	//     ,     
    	public abstract void primitiveoperationA();
    
    	public abstract void primitiveoperationB();
    
    }
    
    //    
    public class ConcreteClass extends AbstractClass {
    
    	@Override
    	public void primitiveoperationA() {
    		System.out.println("primitiveoperationA()    。。。");
    	}
    
    	@Override
    	public void primitiveoperationB() {
    		System.out.println("primitiveoperationA()    。。。");
    	}
    
    }
    
    //      
    public class TestClient {
    
    	public static void main(String[] args) {
    		
    		AbstractClass concrete = new ConcreteClass();
    		concrete.templateMethod();
    	}
    
    }
    
    コードの実現によって、父(高層部品)はいつ制御し、どのように低層のコンポーネントを参加させるか、つまり、高層のコンポーネントは低層のコンポーネントに対しては「私を呼び出しないでください.あなたたちを呼び出します」という方法で、ハリウッドの原則を完璧に体現しています.
    適用済み
  • java.util.coollections()
  • java.io.InputStream()
  • 関連モード
    テンプレート方法、ポリシーモード
    参考資料
  • Head First設計モード」
  • 図面設計モード
  • Java設計モード:23種類の設計モードの全面解析(スーパー詳細)