デザインパターン入門

Template Methodパターン

具体的な処理をサブクラスにまかせる

どんな場合に使うのか

  • 親クラスでアルゴリズムが記述されている(Template Method = display())ので,サブクラス側ではアルゴリズムをいちいち記述する必要がなくなる。コピペで複数のConcreteクラスを作ってしまうと,すべて似て非なるクラスができてしまい保守が面倒である.

ポイント

  • Template Method パターンでは「継承」を利用してプログラムの動作を変更する.Strategy パターンでは「委譲」を利用してプログラムの動作を変更する.
Template Method継承
Strategy委譲

補講

抽象クラスの意義

抽象メソッドにはメソッドの本体が書かれていないので,具体的な処理内容はわかりません.しかし,メソッドの名前を決め,そのメソッドを使ったテンプレートメソッドによって処理を記述することはできるのです.実際の処理内容はサブクラスまで行かなければ決まりませんが,抽象クラスの段階で処理の流れを形作るのは大切なことです.

サンプルプログラム

// AbstractDisplay.cs
namespace chap03 {
  public abstract class AbstractDisplay {
    public abstract void open();
    public abstract void print();
    public abstract void close();
    public void display() {
      open();
      for (int i = 0; i < 5; i++) {
        print();
      }
      close();
    }
  }
}

// CharDisplay.cs
using System;

namespace chap03 {
  class CharDisplay : AbstractDisplay {
    private char ch;
    public CharDisplay(char ch) {
      this.ch = ch;
    }
    override public void open() {
      Console.WriteLine("<<");
    }
    override public void print() {
      Console.WriteLine(ch);
    }
    override public void close() {
      Console.WriteLine(">>");
    }

  }
}

// Program.cs
using System;

namespace chap03 {
  class Program {
    static void Main(string[] args) {
      AbstractDisplay d1 = new CharDisplay('H');
      AbstractDisplay d2 = new StringDisplay("Hello,world");
      AbstractDisplay d3 = new StringDisplay("こんにちは");
      d1.display();
      d2.display();
      d3.display();
      Console.Read();
    }
  }
}

// StringDisplay.cs
using System;

namespace chap03 {
  class StringDisplay : AbstractDisplay {
    private String str;
    private int width;
    public StringDisplay(String str) {
      this.str = str;
      this.width = str.Length;
    }
    public override void open() {
      printline();
    }
    public override void print() {
      Console.WriteLine("|" + str + "|");
    }
    public override void close() {
      printline();
    }
    private void printline() {
      Console.Write("+");
      for (int i = 0; i < width; i++) {
        Console.Write("-");
      }
      Console.WriteLine("+");
    }
  }
}

デザインパターン入門

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます