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]
+------+
|台灣好|
|台灣好|
|台灣好|
|台灣好|
|台灣好|
+------+