概要
テンプレートメソッドパターンは、操作におけるアルゴリズムの骨格を定義し、特定のステップをサブクラスに延期させるデザインパターンです。これにより、サブクラスはアルゴリズムの構造を変更せずに、特定のステップを再定義できます。
実用性
- アルゴリズムの不変部分を一度だけ実装し、可変的な振る舞いをサブクラスに実装させることができます。
- サブクラス間で共通の振る舞いを特定し、コードの重複を避けるために共通クラスに抽出・集中させます。まず既存コードの相違点を特定し、それらを新しい操作として分離します。最後に、これらの新しい操作を呼び出すテンプレートメソッドで異なるコードを置き換えます。
- サブクラスの拡張を制御します。
コード例
1. 抽象親クラスの定義
public abstract class ProcessTemplate
{
// 抽象メソッド - サブクラスで実装
public abstract void InitializeProcess();
public abstract void ExecuteCoreLogic();
public abstract void FinalizeProcess();
// テンプレートメソッド - プロセスの骨格を定義
public void RunProcess()
{
InitializeProcess();
ExecuteCoreLogic();
FinalizeProcess();
Console.WriteLine("プロセス完了");
}
}
2. アルゴリズムを実装するサブクラスの定義
class DataProcessorA : ProcessTemplate
{
public override void InitializeProcess()
{
Console.WriteLine("データプロセッサA: 初期化処理");
}
public override void ExecuteCoreLogic()
{
Console.WriteLine("データプロセッサA: 主要処理を実行");
}
public override void FinalizeProcess()
{
Console.WriteLine("データプロセッサA: 後処理を実行");
}
}
class DataProcessorB : ProcessTemplate
{
public override void InitializeProcess()
{
Console.WriteLine("データプロセッサB: 初期化処理");
}
public override void ExecuteCoreLogic()
{
Console.WriteLine("データプロセッサB: 主要処理を実行");
}
public override void FinalizeProcess()
{
Console.WriteLine("データプロセッサB: 後処理を実行");
}
}
3. クライアントからの呼び出し
static void DemonstrateTemplateMethod()
{
ProcessTemplate processor;
processor = new DataProcessorA();
processor.RunProcess();
processor = new DataProcessorB();
processor.RunProcess();
Console.ReadKey();
}
まとめ
テンプレートメソッドパターンは、コードの再利用とカプセル化を最もシンプルな形で実現するパターンです。多くのシステムライブラリで使用されており、システムの構造をより合理的にします。