最終更新: yamanobori_old 2010年09月21日(火) 11:14:02履歴
デザインパターン入門
デザインパターン入門
- 親クラスでアルゴリズムが記述されている(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("+"); } } }
デザインパターン入門
コメントをかく