我想設計一個機器人模擬器的GUI前端(實際上是一個簡單的遊戲)。但是,我不知道將模擬器組件(例如機器人和牆)傳遞到顯示器的最佳方式。我想隱藏組件的非顯示導向信息(如機器人質量),但仍然能夠識別每個組件的即時打印,即當我繪製組件時,我想以不同的方式繪製機器人,也許這個機器人會有一個名牌或者其他的東西)。最簡單的方法來隱藏類的一部分'公共方法/接口
這裏是一個圖片,希望能解釋設計:
也許有,我還沒有遇到又一個有用的設計模式...
我想設計一個機器人模擬器的GUI前端(實際上是一個簡單的遊戲)。但是,我不知道將模擬器組件(例如機器人和牆)傳遞到顯示器的最佳方式。我想隱藏組件的非顯示導向信息(如機器人質量),但仍然能夠識別每個組件的即時打印,即當我繪製組件時,我想以不同的方式繪製機器人,也許這個機器人會有一個名牌或者其他的東西)。最簡單的方法來隱藏類的一部分'公共方法/接口
這裏是一個圖片,希望能解釋設計:
也許有,我還沒有遇到又一個有用的設計模式...
結帳模型 - 視圖 - 控制器設計模式。它分離數據(機器人的速度,大小,...),演示(機器人的形狀和繪畫方法)和行爲(提高機器人速度)。
要回答你的問題 - 隱藏類的API的最簡單方法是將此類拆分爲多個部分(模型,視圖,控制器)並根據某種模式(MVC或模型視圖展示器,他們中的很多人)。
編輯:對不起,我沒有提供任何示例。我的建議是隻是爲了機器人分成兩類:
模擬器於是包含RobotUi(模擬器是一個模型)和SimulatorDisplay(收集= 視圖 )在執行繪畫方法時遍歷UI對象。 RobotData將隱藏在RobotUi內部。
我想你應該通過接口合約來設計這個。
我會讓你的牆壁,機器人和傳感器成爲用戶界面需要了解的各種「事物」的實現。只有那些界面應該在用戶界面和你的模型之間共享。
例如,機器人,傳感器應實行所謂的打印接口:
public interface Printable {
Shap getShape();
}
牆應該實現一個擴展接口PrintableTexture
public interface PrintableTexture extends Printable {
Texture getTexture();
}
您還可以創建和實施的角度數據提供程序類型的接口,方向等
例如:
public interface RangeProvider {
Range getRange();
}
public interface DirectionProvider {
Direction getDirection();
}
public interface SensorProvider {
Sensor[] getSensors();
}
重點在於'打印'代碼然後會檢查Printable對象(或Printable對象的列表)是否已經傳遞給它並做出適當的反應。
看看你的意見,我認爲PrintableRobot,PrintableWall等是一個界面的基本概念的誤解。一個接口應該更多地關注'提供什麼東西或如何使用它',而不是具體實現如何實現。通過將機器人,牆壁等放入Printable中,您可以指出實施情況。
這邊,你有沒有考慮過Visitor Pattern?你可以讓每個實體實現訪問者模式的接受部分,並讓你的打印代碼成爲一個特殊的實現,它只需要更深入地瞭解每個實體所做的事情就可以得到它所需要的東西......這不是我會做的,但是它可能適合你...
謝謝。我已經嘗試了你的第一個建議。但是,由於每個組件(機器人,牆壁和傳感器)具有不同的打印屬性(機器人具有getDirection,傳感器具有getRange),所以我最終爲每個組件打印了一個Printable接口:PrintableRobot,PrintableSensor等圖表的底部。我不確定這是否好。 – Kevin 2011-05-18 11:23:41
你可以看看訪客模式,我會修改我的帖子... – 2011-05-18 11:28:30
我重新進行了嘗試並使用訪問者模式。然而,我得出的結論是,訪問者模式的功能是爲類添加功能,但是這個功能駐留在另一個「訪問者」類中。它不會隱藏GUI代碼中的非GUI方法(訪問者將引用一個Robot)。話雖如此,我會記住訪客模式,因爲我可以看到它是如何適用於這個問題的。謝謝。 – Kevin 2011-05-19 07:15:34
我實際上實現了MVC。我只是沒有插入圖表,因爲我認爲這會增加複雜性。 SimulatorDisplay對象是模擬器的觀察者(不需要被動視圖和模型之間的控制器)。顯示獲得每個更新()的模擬器對象的引用。但是如何獲得這些信息來打印機器人而不需要獲得完整的機器人? (例如,我不想要它的速度和電機配置)。 – Kevin 2011-05-18 10:46:49
您編輯的建議與我圖中的'最初想法'類似(我的Robot實現了一個GuiRobot接口,並且僅將其傳遞給SimulatorDisplay)。我已經決定採用這種方式 - 用一個RobotUi包裝機器人,這將減少公共接口 - 一個供GUI使用的接口。 – Kevin 2011-05-19 07:22:57