「増補改訂版Java言語で学ぶデザインパターン入門」の「Bridgeパターン」をC#で書いてみました。
GitHubにもコードを置いています。
参考
DesignPattern【Bridge】GitHub
コード
public class Display
{
private DisplayImpl impl;
public Display(DisplayImpl impl)
{
this.impl = impl;
}
public void Open()
{
impl.RawOpen();
}
public void Print()
{
impl.RawPrint();
}
public void Close()
{
impl.RawClose();
}
public void DisplayShow()
{
Open();
Print();
Close();
}
}
public class CountDisplay : Display
{
public CountDisplay(DisplayImpl impl) : base(impl)
{
}
public void MultiDisplay(int times)
{
Open();
for (int i = 0; i times; i++)
{
Print();
}
Close();
}
}
public abstract class DisplayImpl
{
public abstract void RawOpen();
public abstract void RawPrint();
public abstract void RawClose();
}
public class StringDisplayImpl : DisplayImpl
{
private string str;
private int width;
public StringDisplayImpl(string str)
{
this.str = str;
this.width = Encoding.GetEncoding("Shift_JIS").GetByteCount(str);
}
public override void RawClose()
{
PrintLine();
}
public override void RawOpen()
{
PrintLine();
}
public override void RawPrint()
{
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);
Display d1 = new Display(new StringDisplayImpl("Hello, Japan."));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
d1.DisplayShow();
d2.DisplayShow();
d3.DisplayShow();
d3.MultiDisplay(5);
}
}
実行結果は以下のようになります。
+-------------+
|Hello, Japan.|
+-------------+
+-------------+
|Hello, World.|
+-------------+
+----------------+
|Hello, Universe.|
+----------------+
+----------------+
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
+----------------+
その他のデザインパターンは以下の記事から確認してください。