「増補改訂版Java言語で学ぶデザインパターン入門」の「Decoratorパターン」をC#で書いてみました。
GitHubにもコードを置いています。
参考
DesignPattern【Decorator】GitHub
コード
public abstract class Display
{
public abstract int GetColumns();
public abstract int GetRows();
public abstract string GetRowText(int row);
public void Show()
{
for (int i = 0; i GetRows(); i++)
{
Console.WriteLine(GetRowText(i));
}
}
}
public class StringDisplay : Display
{
private string str;
public StringDisplay(string str)
{
this.str = str;
}
public override int GetColumns()
{
return Encoding.GetEncoding("Shift_JIS").GetByteCount(str);
}
public override int GetRows()
{
return 1;
}
public override string GetRowText(int row)
{
if(row == 0)
{
return str;
}
else
{
return null;
}
}
}
public abstract class Border : Display
{
protected Display display;
protected Border(Display display)
{
this.display = display;
}
}
public class SideBorder : Border
{
private char borderChar;
public SideBorder(Display display, char ch) : base(display)
{
borderChar = ch;
}
public override int GetColumns()
{
return 1 + display.GetColumns() + 1;
}
public override int GetRows()
{
return display.GetRows();
}
public override string GetRowText(int row)
{
return borderChar + display.GetRowText(row) + borderChar;
}
}
public class FullBorder : Border
{
public FullBorder(Display display) : base(display)
{
}
public override int GetColumns()
{
return 1 + display.GetColumns() + 1;
}
public override int GetRows()
{
return 1 + display.GetRows() + 1;
}
public override string GetRowText(int row)
{
if (row == 0)
{
return "+" + MakeLine('-', display.GetColumns()) + "+";
}
else if(row == display.GetRows() + 1)
{
return "+" + MakeLine('-', display.GetColumns()) + "+";
}
else
{
return "|" + display.GetRowText(row - 1) + "|";
}
}
public string MakeLine(char ch, int count)
{
StringBuilder buf = new StringBuilder();
for (int i = 0; i count; i++)
{
buf.Append(ch);
}
return buf.ToString();
}
}
class Program
{
static void Main(string[] args)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Display b1 = new StringDisplay("Hello World.");
Display b2 = new SideBorder(b1, '#');
Display b3 = new FullBorder(b2);
b1.Show();
b2.Show();
b3.Show();
Display b4 =
new SideBorder(
new FullBorder(
new FullBorder(
new SideBorder(
new FullBorder(
new StringDisplay("こんにちは。")
), '*'
)
)
),
'/'
);
b4.Show();
}
}
実行結果は以下のようになります。
Hello World.
#Hello World.#
+--------------+
|#Hello World.#|
+--------------+
/+------------------+/
/|+----------------+|/
/||*+------------+*||/
/||*|こんにちは。|*||/
/||*+------------+*||/
/|+----------------+|/
/+------------------+/
その他のデザインパターンは以下の記事から確認してください。