Strategyパターン@Java言語で学ぶデザインパターン入門

Java画像

参考書籍

Java言語で学ぶデザインパターン入門第3版

Strategyパターンとは

参考書籍では以下のように説明されています。

実装したアルゴリズムをごっそり交換できるようになっています。

アルゴリズムをカチッと切り替え、同じ問題を別の方法で解くのを容易にするパターン、それがstrategyパターンなのです

メリット

  • アルゴリズムを容易に切り替えることができる
  • 実行中にアルゴリズムを切り替えることもできる

詳しくはサンプルコードを見ながら説明していきます。

サンプルコード

ジャンケンの戦略をStrategyパターンを使って切り替えてみたいと思います。

戦略は以下の2つです。

  • FoolStrategy:毎回ランダムに出す手を決める
  • SmartStrategy:次の手を確立を使って計算する

UML以下の通り

Hand型

ジャンケンの手を定義するHand型を定義します。

Hand配列にはSingletonパターンが使われています。

詳細は以下の記事を参考にしてください。

Java画像 Singletonパターン@Java言語で学ぶデザインパターン入門

次の手を取得するgetHand()メソッドではstatic FactoryMethodパターンが使われています。

詳細は以下の記事を参考にしてください。

Java画像 FactoryMethodパターン@Java言語で学ぶデザインパターン入門

fight()メソッドを使って手の強さを判定していきます。

Strategyインターフェース

ジャンケンの戦略のための抽象メソッドを集めたものです。

nextHand()メソッド:次の手をきめます

study()メソッド:次の手を決めるための学習をします

FoolStrategyクラス

勝負に勝ったら次はグーを、それ以外はランダムで次の手を決めます。

SmartStrategyクラス

次に出す手を乱数で決めますが、過去の戦歴から次に出す手の確率を変えています。

m_history[前回に出した手][今回出す手]というふうな意味を持ちます。

Playerクラス

実際にじゃんけんをする人です。

実際に次の手を決めるのはStrategyクラスに任せているのがポイントです。

Mainクラス

実行結果

メリットの確認

メリットは以下の二つでした。

・アルゴリズムを容易に切り替えることができる
・実行中にアルゴリズムを切り替えることもできる

Mainクラスを見てみてください。

実行中に簡単にアルゴリズムを切り替えられているのがわかります。

コメントを残す

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

CAPTCHA


error: Content is protected !!