テンプレートメソッドパターン - アルゴリズムの骨格を定義する設計パターン

概要

テンプレートメソッドパターンは、操作におけるアルゴリズムの骨格を定義し、特定のステップをサブクラスに延期させるデザインパターンです。これにより、サブクラスはアルゴリズムの構造を変更せずに、特定のステップを再定義できます。

実用性

  1. アルゴリズムの不変部分を一度だけ実装し、可変的な振る舞いをサブクラスに実装させることができます。
  2. サブクラス間で共通の振る舞いを特定し、コードの重複を避けるために共通クラスに抽出・集中させます。まず既存コードの相違点を特定し、それらを新しい操作として分離します。最後に、これらの新しい操作を呼び出すテンプレートメソッドで異なるコードを置き換えます。
  3. サブクラスの拡張を制御します。

コード例

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();
}

まとめ

テンプレートメソッドパターンは、コードの再利用とカプセル化を最もシンプルな形で実現するパターンです。多くのシステムライブラリで使用されており、システムの構造をより合理的にします。

タグ: デザインパターン テンプレートメソッド オブジェクト指向 アルゴリズム コード再利用

7月26日 19:31 投稿