私のボードゲームでは、今度は駒の移動システムを何度か変更し、毎回面倒なので、Player
クラスとBoard
クラスを分離したいと思います。ボードの状態を変更するためにプレーヤーのリクエストを取得するためにいくつかのインターフェイスを使用できると思いますが、コマンドまたはMediatorインターフェイスが適切なソリューションであるかどうかを判断できません(またはオブザーバーですか?)
私の理解では、コマンドは、クライアントがレシーバーに対して実行したいことを、実行方法を知らないまま実行します。しかし、メディエーターはほとんど同じことをしませんか?リクエストオブジェクトを指定すると、メディエーターがクライアントに代わってリクエストを実行しますか?メディエーターは双方向通信を容易にしますか?プレイヤーは駒の移動をリクエストできますが、成功した場合、ボードはプレイヤーに新しいボードの状態を通知できますか?
基本的に、3つの関連しているように見えるパターン間でクラスを分離する方法を知るのに苦労しています。私はこれに関するGoFの議論を読みましたが、彼らがお互いに役立つときの具体的な例を使用していないので、私はまだ混乱しています。
Mediator
は、お互いを知らない「同僚」オブジェクト間の相互作用についてです。 Command
は、1つの特定の対話を実行する方法についてです(コマンドがプレーヤーによって作成されたかメディエーターによって作成されたかに関係なく)。したがって、問題はどの代替案を使用するかではなく、それぞれがどのように目的を果たすことができるかについてです。
メディエーターパターン の目的は、複数の同僚オブジェクト間の相互作用をカプセル化して、それらを互いに分離することです。メディエーターを使用してPlayer
とBoard
を分離すると、設計が少し複雑になります。
Player
とBoard
は同じ共通のColleague
インターフェースを実装しますPlayer
はMediator
に移動リクエストを送信しますMediator
は、プレーヤーのリクエストがBoard
に送信されることを認識していますBoard
はMediator
からリクエストを受け取りますBoard
リクエストを分析し、Mediator
にそれが受け入れられた(または拒否された)ことを通知しますMediator
は、このようなやり取りがPlayer
に送信されることを知っていますPlayer
はMediator
から回答を受け取りますさらに、GoFで述べたように、メディエーターをさまざまな同僚のオブザーバーにして、関連する状態の変化を通知し、アクションをトリガーできるようにすると便利です。
このより複雑なアプローチの利点は、その柔軟性です。たとえば、2 Players
とBoard
を使用できます。タイマーColleague
を追加できます。顧問/コーチColleague
を追加して、人間の動きがどれほど優れているかを人間のプレーヤーに知らせる(または同様の情報を機械学習AIプレーヤーに提供する)ことができます。
さらに、同僚が切り離されているため、他のゲームでそれらを再利用できる可能性があります。
コマンドパターン の目的は、リクエストをカプセル化することです。したがって、ボードの動きをカプセル化し、それらを実行できるようにします(またはユーザーが取り消しをアクティブにした場合は逆にします)。
Player
にBoard
の状態変化を観察させるために、必ずオブザーバーパターンを使用します。また、2番目のPlayer
(AIまたは人間)もBoard
変更をサブスクライブし、移動をトリガーするコマンドを発行します。また、ゲームのメインループがあり、タイマーを追加できます。
最終的には、同様の構造になります(ゲームループがピースを接着します)。ただし、オブジェクトは相互に認識している必要があり、オブジェクト間の相互作用の変更には、関連するすべてのクラスの適応が必要になる場合があります。
Command
を使用することをお勧めします。