2014年09月25日

ストラテジー

Strategy

戦略という意味。
比較的良く目にするパターンであり、使いどころも結構あります。
アルゴリズム(戦略)自体を使用する側のIFを変えることなく代替可能にする。

サンプルコード

基本構成
    interface IStrategy
    {
        void DoSomething();
    }

    class StrategyA : IStrategy
    {
        public void DoSomething()
        {
            Console.WriteLine("Strategy A.");
        }
    }

    class StrategyB : IStrategy
    {
        public void DoSomething()
        {
            Console.WriteLine("Strategy B.");
        }
    }

    class Context
    {
        public IStrategy Strategy { set; private get; }
         
        public void Execute()
        {
            Strategy.DoSomething();
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            var ctxt = new Context();
            ctxt.Strategy = new StrategyA();
            ctxt.Execute();
            ctxt.Strategy = new StrategyB();
            ctxt.Execute();
        }
    }

サンプルコード

もう少し具体的な使用例

    // 基本は「戦え」
    interface IStrategy
    {
        void Fight();
    }
    // 抽象基底クラスの定義 メンバが3人居ます。
    abstract class AStrategy : IStrategy
    {
        protected Member Soldire;
        protected Member Priest;
        protected Member Magician;

        public AStrategy()
        {
            Soldire = new Member() { Job = "戦士" };
            Priest = new Member() { Job = "僧侶" };
            Magician = new Member() { Job = "魔法使い" };
        }

        public abstract void Fight();
        
    }
    // 強気の戦略
    class BullStrategy : AStrategy
    {
        public override void Fight()
        {
            Console.WriteLine("ガンガンいこうぜ");
            Soldire.SetCommand("攻撃");
            Priest.SetCommand("ザキ");
            Magician.SetCommand("イオナズン");
        }
    }
    // 通常時の戦略
    class NormalStrategy : AStrategy
    {
        public override void Fight()
        {
            Console.WriteLine("みんながんばれ");
            Soldire.SetCommand("攻撃");
            Priest.SetCommand("ホイミ");
            Magician.SetCommand("メラミ");
        }
    }
    // 弱気の戦略
    class BearStrategy : AStrategy
    {
        public override void Fight()
        {
            Console.WriteLine("いのちだいじに");
            Soldire.SetCommand("薬草");
            Priest.SetCommand("べホイミ");
            Magician.SetCommand("防御");
        }
    }
    // 戦略をラップ(カプセル化)します。
    class Context
    {
        public IStrategy Strategy { set; private get; }

        public void Execute()
        {
            Strategy.Fight();
        }
    }
    // メンバークラス 職業名とコマンド
    public class Member
    {
        public string Job{get;set;}
        public void SetCommand(string command)
        {
            Console.WriteLine("{0} {1}", Job, command);
        }
    }


これらを使う方のコード
    class Tester
    {
       static void Main(string[] args)
        {
            var ctxt = new Context();
            ctxt.Strategy = new BullStrategy();
            ctxt.Execute();
            ctxt.Strategy = new NormalStrategy();
            ctxt.Execute();
            ctxt.Strategy = new BearStrategy();
            ctxt.Execute();
        }
    }

posted by RR at 23:22 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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