2016-08-12 25 views
0

エージェントのコレクションをモデリングしているとします。これらのエージェントは、PlayerまたはBotによって制御されます。さらに、各エージェントには、エクスプローラやエンジニアなどの役割があります。すべてのロールは同じ共通アクションを共有しますが、それぞれのアクションは少し異なる方法で実装されることがあります。理想的には、agentInstance.move()を呼び出すことができ、アクションは役割に応じて再生されます。多くの実装セットの1つをオブジェクトに接続するにはどうすればよいですか?

私はこれをしばらくモデル化する方法に取り組んでおり、具体的にはStrategyTemplateのパターンを調べましたが、必要なものかどうかはわかりません。

1つのアイデアは、抽象エージェントのPlayerおよびBotサブクラスを作成し、エクスプローラおよびエンジニアの抽象的な役割のサブクラスを作成することです。次に、各エージェントに役割が割り当てられます。しかし、それは私がこのようなコマンド、例えばagentInstance.getRole().move()をパススルーするか、agentInstance.move(){ this.role.move(); }のようなヘルパー関数を作成しなければならないことを暗示しているようです。

Example Model - Note that Agent and Role would have to share methods by coincidence.

私も自分のデザインがビットインタフェース欠損することができることを承知しているので、私はその後、エージェントによって継承されるデフォルトの実装でインターフェースとサブインターフェースとしての役割をモデリングすると考えられ、それは感じています問題を探している解決策のように。

だから、これをモデリングするにはどうすればよいでしょうか?決定にはどのような考慮事項が必要ですか?特にJava 8のインタフェースと抽象クラスがどれほど似ているのか?

答えて

1

私はこのようにそれを行うだろう:それは何の属性を持っていないので、私はインターフェイスの役割をします

  • 。エクスプローラと エンジニアは、戦略 の仕組みであるインタフェースb'cozではないクラスになります。
  • プレイヤーとボットがエージェントに関連付けられ、エージェントに オーダーを発行できるようになります。私にとって

OOP分析と設計を行う場合、2つの重要な考慮事項があります

  • は、それは私の問題を解決していますか?それはそれを修正しないでください!将来の問題 は今後の問題です。
  • できるだけリファクタリングするのは簡単です。新しい要件として が登場すれば、多くのリファクタリングが必要になります。公正だ

enter image description here

+0

- 必要性に関するあなたの考えは "トンネル"()agent.role.move経由でコマンドを何ですか?それは私のように実際には汚いのではないですか? –

+0

多義性を使うのがポイントなので、私にとっては受け入れられます。しかし、Player/BotがagentInstance.move()を呼び出さなければならない場合は、より良いでしょう。次に、Agent.Move()内でRole.Move()を呼び出すなどして、Move()ビヘイビアーをエージェントの役割に委譲します。そのエージェントに与える役割によって、それは異なって動くでしょう。しかし、それは主にあなたがモデリングしているビジネスに依存しています。 –

関連する問題