2014年09月08日

チェイン・オブ・レスポンシビリティ

Chain of Responsibility

「責任のたらい回し」なんて訳される。
使いどころがないこと無さそうだけれど、使ったこともないし見かけたこともない。


サンプルコード

申請金額が一万円以内なら課長が承認してくれますし、それ以上なら部長に回します。
部長は10万円以内なら承認しますが、それ以上なら社長に回します。
社長は100万円以内なら認めてくれます。
    public interface 社員
    {
        社員 Next(社員 next);

        bool 承認する(int amount);
    }

    public class 社長 : 社員
    {

        public 社員 Next(社員 next)
        {
            throw new InvalidOperationException();
        }

        public bool 承認する(int amount)
        {
            return amount <= 1000000;
        }
    }

    public class 部長 : 社員
    {
        private 社員 _next;

        public 社員 Next(社員 next)
        {
            _next = next;
            return next;
        }

        public bool 承認する(int amount)
        {
            if (amount <= 100000)
            {
                return true;
            }
            else
            {
                return _next.承認する(amount);
            }
        }
    }

    public class 課長 : 社員
    {

        private 社員 _next;

        public 社員 Next(社員 next)
        {
            _next = next;
            return next;
        }

        public bool 承認する(int amount)
        {
            if(amount <=10000)
            {
                return true;
            }
            else
            {
                return _next.承認する(amount);
            }
        }
    }


使う方はこんな感じ

       static void Main(string[] args)
        {
            社員 磯野課長 = new 課長();
            社員 野比部長 = new 部長();
            社員 勇崎社長 = new 社長();

            磯野課長.Next(野比部長).Next(勇崎社長);

            var ret1 = 磯野課長.承認する(5000);
            var ret2 = 磯野課長.承認する(55000);
            var ret3 = 磯野課長.承認する(5555000);
        }
posted by RR at 23:24 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。