まさるblog

越後在住アプリケーションエンジニア奮闘記

目次

Blog 利用状況

ニュース

07/04/23
新規加入しました。
よろしくお願いします。

07/06/02
東京勉強会#8に参加しました。

07/10/21
情報処理技術者試験(NW)受験しました。

07/11/17
オブジェクト指向分科会#2参加しました。

07/12/06
SOFTWARE TOYBOXオープンしました。

08/03/02
息子誕生しました。

08/03/05
twitterはじめました。

現在
子育て奮闘中です。
デザインパターン勉強中です。
iKnow!、ESLPodcastなどで英語勉強中です。

ブログパーツ

あわせて読みたい

書庫

日記カテゴリ

コミュニティ

色々

デザインパターンを学ぶ~その1:Strategyパターン(1)~

Strategy (ストラテジー)
 戦略、兵法、作戦、etc...

Strategyパターンとは、オブジェクトの振舞いを"戦略"とみなして、戦略の切替、追加を簡単に行うことができるパターンです。

戦略の部分をクラスとして定義しておき、呼び出し元では利用する戦略クラスを変更することにより、戦略の切替を行います。

 

以下に例を示します。

  1. 走る"振る舞い"をあらわすInterfaceを定義する。
    C# Code
    // 走る"振る舞い"
    public interface IRunBehavior
    {
        void Run();
    }
    
  2. IRunBehavior Interfaceを実装したクラスを作成し、実際に走る"振る舞い"を定義します。
    C# Code
    // 速く走る
    public class RunFastBehavior : IRunBehavior
    {
        public void Run()
        {
            Console.WriteLine("速く走る!");
        }
    }
    
    // ふつうに走る
    public class RunBehavior : IRunBehavior
    {
        public void Run()
        {
            Console.WriteLine("ふつうに走る");
        }
    }
    
    // ゆっくり走る
    public class RunSlowBehavior : IRunBehavior
    {
        public void Run()
        {
            Console.WriteLine("ゆっくり走る~");
        }
    }
    
  3. 走る動作を行うクラスを作成します。その際、走る動作はIRunBehavior型のフィールドのRunメソッドを呼び出す(IRunBehaviorに委譲する)ようにします。
    また、走る"振る舞い"を交換できるように、setアクセサのみを持つプロパティを定義します。
    C# Code
    // 人間クラス
    public class Human
    {
        // 走る"振る舞い"
        private IRunBehavior runBehavior;
    
        // コンストラクタ
        public Human()
        {
            // コンストラクタ内で、IRunBehaviorクラスのインスタンスを生成
            runBehavior = new RunBehavior();
        }
    
        // 走る動作
        public void ParformRun()
        {
            // IRunBehaviorに委譲
            runBehavior.Run();
        }
    
        // 走る"振る舞い"をセットするプロパティ
        public IRunBehavior RunBehavior
        {
            set { this.runBehavior = value; }
        }
    }
    

以上のコードを実行してみます。

 

実行用コード

C# Code
public class StrategyTest
{
    static void Main(string[] args)
    {
        Console.WriteLine("よーい、スタート!");

        // まず、そのまま走ります
        Human human = new Human();
        human.ParformRun();

        // 速く走ります
        human.RunBehavior = new RunFastBehavior();
        human.ParformRun();

        // ゆっくり走ります
        human.RunBehavior = new RunSlowBehavior();
        human.ParformRun();

        Console.WriteLine("ゴール!");
    }
}

実行結果

よーい、スタート!
ふつうに走る
速く走る!
ゆっくり走る~
ゴール!

上記のように、走る"振る舞い"を交換しながらプログラムが実行されるのが確認できます。

 

次回は実際に実務でどのように使用すればよいかこれから考えて(^^;書こうと思います。

 

#間違っているところがあったらツッコミをお願いしますm(_ _)m

投稿日時 : 2007年5月12日 2:38

Feedback

# re: デザインパターンを学ぶ~その1:Strategyパターン(1)~ 2007/05/12 7:55 えムナウ

Strategyの意味とこのパターンがStrategyと呼ばれる意味が書いてない。
通常それだけで全体像が理解でき細かく見る必要がないのがデザインパターンのパターンたる利点ではないか?

# re: デザインパターンを学ぶ~その1:Strategyパターン(1)~ 2007/05/12 9:14 まさる

>えむナウさん
う゛っ・・・その通りでございます。
調べて追記しておきます。

# デザインパターンを学ぶ~その1:Strategyパターン(2)~ 2007/05/15 23:29 まさるblog

デザインパターンを学ぶ~その1:Strategyパターン(2)~

# デザインパターンを学ぶ~その9:ちょっとだけStrategyパターン~ 2007/06/28 23:51 まさるblog

デザインパターンを学ぶ~その9:ちょっとだけStrategyパターン~

タイトル  
名前  
Url
コメント