はじめに
前回UnityでStrategyパターンを学んでみるといった記事を書きました。
ただWikipediaを見ていたところ、このような表記を見つけました。
C#はJava同様にクラスやインターフェイスによるポリモーフィズムを用いることもできるが、カスタマイズポイントがひとつのメソッドしかない場合(オブジェクトの他のプロパティやメソッドにアクセスしない場合)は、継承関係を必要としないデリゲートを使うほうが好まれる。
Strategyパターンの実装としてインターフェイスやクラスを用いる方法しか知らなかったのですが、どうやらデリゲートを使う方法もあるみたいです。
これがどんなものなのか、実際に試してみましょう。
実際に使ってみる
基本はこちらのサイトを利用していますが、いつくか自分なりに書き換えています。
このサンプルもなるべくシンプルを意識して、いろんな応用が利くようなスクリプトにしてみました。
using UnityEngine; using System; //Actionデリゲートを使うため /// <summary> /// アルゴリズムAを実装しているクラス /// </summary> class ConcreteStrategyA { public void Execute() { Debug.Log("アルゴリズムA"); } } /// <summary> /// アルゴリズムBを実装しているクラス /// </summary> class ConcreteStrategyB { public void Execute() { Debug.Log("アルゴリズムB"); } } /// <summary> /// アルゴリズムCを実装しているクラス /// </summary> class ConcreteStrategyC { public void Execute() { Debug.Log("アルゴリズムC"); } } /// <summary> /// アルゴリズムの制御情報を持つクラス(状況に応じて異なる動作を行う) /// ConcreteStrategyのExecute() を指定して作成し、Actionデリゲートとしてを保持する /// </summary> class Context { Action _executeStrategy; /// <summary> /// コンストラクタ /// </summary> public Context(Action executeStrategy) { _executeStrategy = executeStrategy; } /// <summary> /// 実際に外部から使うメソッドはコレ /// </summary> public void Execute() { _executeStrategy(); } } public class StrategyTest : MonoBehaviour { private void Start() { Context context; context = new Context(new ConcreteStrategyA().Execute); context.Execute(); //アルゴリズムA context = new Context(new ConcreteStrategyB().Execute); context.Execute(); //アルゴリズムB context = new Context(new ConcreteStrategyC().Execute); context.Execute(); //アルゴリズムC } }
おそらく前回のサンプルよりも分かりやすくシンプルかもしれません。
ただ少し制約がありますが、前回と同様な結果を得ることができました。
さいごに
Starategyパターンにはデリゲートを使った方法もあるんだという事を頭の片隅に置いていくといいかもしれません!