2016-08-12 49 views
0

假設我正在爲一組代理建模。這些代理可能受Player或Bot的控制。此外,每個代理都有一個角色 - 例如資源管理器或工程師。所有角色共享相同的常見操作,但每個角色可能會稍微有點不同。理想情況下,您將能夠調用agentInstance.move(),並根據他們具有的角色執行操作。如何將許多實現集中的一個連接到對象?

我一直在摔跤如何建模一段時間,並專門查看了StrategyTemplate模式 - 但我不確定它們是我需要的。

一個想法是使抽象Agent的Player和Bot子類,並使抽象Role的Explorer和Engineer子類。然後每個代理都會有一個角色。但是,這似乎意味着我必須像這樣傳遞我的命令: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是戰略 如何工作。
  • 玩家和機器人將與代理關聯,以便他們可以向代理髮出 訂單。

    • 它解決我的問題:

    對我來說,做面向對象分析與設計時,有2只重要的考慮?如果它確實沒有修復它!未來的問題 是未來的問題。

  • 它必須儘可能容易重構。隨着新的要求 進來,你將不得不做很多重構。

enter image description here

+0

這是公平的 - 什麼是你就需要思考 「隧道」 通過agent.role.move命令()?這實際上不像我看起來那麼骯髒? –

+0

這是可以接受的,因爲整點是使用多態性。但是,如果Player/Bot只需要調用agentInstance.move(),會更好。然後,將Move()行爲委託給代理的角色(例如,通過在Agent.Move()中調用Role.Move())。然後根據您給該代理的角色,它會以不同的方式移動。但這主要取決於你正在建模的業務。 –

相關問題