4.テンプレートメソッドモード(Template Method Pattern)
3188 ワード
定義:
操作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延します.サブクラスは、アルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義することができる.
例:
Threadを継承してマルチスレッドクラスを実装する場合、runメソッドを書き換え、startメソッドを呼び出します.startメソッドは親クラスに定義され、サブクラスのrunメソッドが呼び出され、テンプレートメソッドモードの典型的な応用です.
特徴:
不変の挙動をスーパークラスに移し,サブクラスで繰り返されるコードを除去して彼の優位性を体現する.
テンプレートメソッドモードは非常に簡単で、Javaの継承メカニズムだけを使用していますが、非常に広く応用されているモードです.抽象テンプレートのメソッドは、次の2つに分類されます.
悪意のある操作を防ぐために、一般的なテンプレートメソッドには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タイプに設定しないでください.実装クラスが必要でない場合は、親のアクセス権を拡大しないようにします.
テンプレートメソッドモードの利点:
テンプレートメソッドパターンの欠点:
私たちの設計習慣に従って、抽象クラスは最も抽象的で、最も一般的な物事の属性と方法を宣言し、クラスが具体的な物事の属性と方法を完成することを実現します.しかしテンプレートメソッドパターンは逆転し,抽象クラスは一部の抽象メソッドを定義し,サブクラスによって実現され,サブクラスの実行結果は親クラスの結果,すなわち子クラスが親クラスに影響を及ぼし,複雑なプロジェクトではコード読解の難しさをもたらし,初心者に不快感を与える.
テンプレートメソッドモードの使用シーン: