4.テンプレートメソッドモード(Template Method Pattern)



定義:
操作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延します.サブクラスは、アルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義することができる.
 
例:
Threadを継承してマルチスレッドクラスを実装する場合、runメソッドを書き換え、startメソッドを呼び出します.startメソッドは親クラスに定義され、サブクラスのrunメソッドが呼び出され、テンプレートメソッドモードの典型的な応用です.
 
特徴:
不変の挙動をスーパークラスに移し,サブクラスで繰り返されるコードを除去して彼の優位性を体現する.
 
テンプレートメソッドモードは非常に簡単で、Javaの継承メカニズムだけを使用していますが、非常に広く応用されているモードです.抽象テンプレートのメソッドは、次の2つに分類されます.
  • 基本メソッド:基本オペレーションとも呼ばれ、サブクラスによって実現されたメソッドであり、テンプレートメソッドで呼び出される.
  • テンプレートメソッド:1つまたはいくつかあり、一般的には具体的なメソッド、すなわちフレームワークであり、基本メソッドのスケジューリングを実現し、固定的な論理を完了する.

  • 悪意のある操作を防ぐために、一般的なテンプレートメソッドにはfinalキーワードが付けられており、布団類の書き換えは許されません.
     
    次に、このモードの共通コードを見てください.
     
    テンプレートクラス:
    package _4TemplateMethodPattern;
    
    public abstract class AbstractTemplate {
    
    	//     
    	protected abstract void doSomeThing();
    	
    	//     
    	protected abstract void doAnyThing();
    	
    	//     ,             
    	//              ,     final
    	public final void templateMethod()
    	{
    		doSomeThing();
    		doAnyThing();
    	}
    }

     
    実装クラス1:
     
    package _4TemplateMethodPattern;
    
    public class Template1 extends AbstractTemplate {
    
    	@Override
    	protected void doSomeThing() {
    		System.out.println("Template1.doSomeThing");
    	}
    
    	@Override
    	protected void doAnyThing() {
    		System.out.println("Template1.doAnyThing");
    	}
    
    }

     
    実装クラス2:
     
    package _4TemplateMethodPattern;
    
    public class Template2 extends AbstractTemplate {
    
    	@Override
    	protected void doSomeThing() {
    		System.out.println("Template2.doSomeThing");
    	}
    
    	@Override
    	protected void doAnyThing() {
    		System.out.println("Template2.doAnyThing");
    	}
    
    }

     
     
    Clientクラス:
     
     
    package _4TemplateMethodPattern;
    
    public class Client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		AbstractTemplate a1 = new Template1();
    		AbstractTemplate a2 = new Template2();
    		a1.templateMethod();
    		a2.templateMethod();
    	}
    
    }
    

     
    抽象テンプレートの基本的な方法はできるだけprotectedタイプに設計され、ディミットの法則に合致し、露出する属性や方法をpublicタイプに設定しないでください.実装クラスが必要でない場合は、親のアクセス権を拡大しないようにします.
     
    テンプレートメソッドモードの利点:
  • パッケージ不変部分、拡張可変部分
  • 共通コードを抽出し、
  • のメンテナンスを容易にする.
  • 動作は親によって制御され、子によって実現される.基本的な方法はサブクラスによって完成されるので,サブクラスは拡張によって対応する機能を増加させ,開閉の原則に合致することができる.

  • テンプレートメソッドパターンの欠点:
    私たちの設計習慣に従って、抽象クラスは最も抽象的で、最も一般的な物事の属性と方法を宣言し、クラスが具体的な物事の属性と方法を完成することを実現します.しかしテンプレートメソッドパターンは逆転し,抽象クラスは一部の抽象メソッドを定義し,サブクラスによって実現され,サブクラスの実行結果は親クラスの結果,すなわち子クラスが親クラスに影響を及ぼし,複雑なプロジェクトではコード読解の難しさをもたらし,初心者に不快感を与える.
     
    テンプレートメソッドモードの使用シーン:
  • 複数のサブクラスには共通の方法があり、論理的基本相は同時に
  • である.
  • 複雑なアルゴリズムであれば,コアアルゴリズムをテンプレートメソッドとして設計することができ,周辺の関連詳細機能は各サブクラスによって
  • を実現する.
  • 再構成の場合、テンプレートメソッドモードはよく使用されるモードであり、同じコードを親クラスに抽出し、フック関数によって動作
  • を制約する.