「増補改訂版Java言語で学ぶデザインパターン入門」の「TemplateMethodパターン」をC#で書いてみました。
GitHubにもコードを置いています。
参考
DesignPattern【TemplateMethod】GitHub
コード
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 readonly char ch;
public CharDisplay(char ch)
{
this.ch = ch;
}
public override void Close()
{
Console.WriteLine(">>");
}
public override void Open()
{
Console.Write("");
}
public override void Print()
{
Console.Write(ch);
}
}
public class StringDisplay : AbstractDisplay
{
private readonly string str;
private readonly int width;
public StringDisplay(string str)
{
this.str = str;
this.width = Encoding.GetEncoding("Shift_JIS").GetByteCount(str);
}
public override void Close()
{
PrintLine();
}
public override void Open()
{
PrintLine();
}
public override void Print()
{
Console.WriteLine($"|{str}|");
}
private void PrintLine()
{
Console.Write("+");
for (int i = 0; i width; i++)
{
Console.Write("-");
}
Console.WriteLine("+");
}
}
class Program
{
static void Main(string[] args)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello, world.");
AbstractDisplay d3 = new StringDisplay("こんにちは。");
d1.Display();
d2.Display();
d3.Display();
}
}
実行結果は以下のようになります。
<<HHHHH>>
+-------------+
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
+-------------+
+------------+
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
+------------+
その他のデザインパターンは以下の記事から確認してください。