「JAVA言語で学ぶデザインパターン入門」をC#で書いてみた【Decoratorパターン】

「増補改訂版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.#|
+--------------+
/+------------------+/
/|+----------------+|/
/||*+------------+*||/
/||*|こんにちは。|*||/
/||*+------------+*||/
/|+----------------+|/
/+------------------+/

その他のデザインパターンは以下の記事から確認してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA