|
Design Pattern - Template Method
|
| (史帝芬, 2006/06/18, hi.steven@gmail.com) |
母類別只先定義演算法的輪廓,將某些實作留給子類別,這是Template的精神,以便在不改變
演算法整體構造的情況下,讓子類別去精鍊某些步驟。底下的例子母類別定義了open、print、close
三個method,實作留給子類別,子類別CharDisplay、StringDisplay會分別以不同的方法實作出
需要的演算法。
![]() [C#程式]
using System;
using System.Text;
namespace Template
{
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();
}
}
public class CharDisplay : AbstractDisplay
{
private char ch;
public CharDisplay(char ch)
{
this.ch = ch;
}
public override void open()
{
Console.Write("[");
}
public override void print()
{
Console.Write(ch);
}
public override void close()
{
Console.WriteLine("]");
}
}
public class StringDisplay : AbstractDisplay
{
private string s;
private int width;
public StringDisplay(string s)
{
this.s = s;
byte[] byteS = Encoding.GetEncoding("Big5").GetBytes(s);
this.width = byteS.Length;
}
private void printLine()
{
Console.Write("+");
for (int i = 0; i < width; i++)
{
Console.Write("-");
}
Console.WriteLine("+");
}
public override void open()
{
printLine();
}
public override void print()
{
Console.WriteLine("|" + s + "|");
}
public override void close()
{
printLine();
}
}
class Program
{
static void Main(string[] args)
{
AbstractDisplay dispC = new CharDisplay('X');
dispC.display();
AbstractDisplay dispS = new StringDisplay("台灣好");
dispS.display();
Console.ReadLine();
}
}
}
[執行結果] [XXXXX] +------+ |台灣好| |台灣好| |台灣好| |台灣好| |台灣好| +------+ |