2011-05-18 61 views
5

我想设计一个机器人模拟器的GUI前端(实际上是一个简单的游戏)。但是,我不知道将模拟器组件(例如机器人和墙)传递到显示器的最佳方式。我想隐藏组件的非显示导向信息(如机器人质量),但仍然能够识别每个组件的即时打印,即当我绘制组件时,我想以不同的方式绘制机器人,也许这个机器人会有一个名牌或者其他的东西)。最简单的方法来隐藏类的一部分'公共方法/接口

这里是一个图片,希望能解释设计: Program Design

也许有,我还没有遇到又一个有用的设计模式...

回答

1

结帐模型 - 视图 - 控制器设计模式。它分离数据(机器人的速度,大小,...),演示(机器人的形状和绘画方法)和行为(提高机器人速度)。

要回答你的问题 - 隐藏类的API的最简单方法是将此类拆分为多个部分(模型,视图,控制器)并根据某种模式(MVC或模型视图展示器,他们中的很多人)。

编辑:对不起,我没有提供任何示例。我的建议是只是为了机器人分成两类:

  • RobotData(包含速度,大小,...提供getter/setter方法,简单的Java bean对象)
  • RobotUi(提供形状法(使用RobotData的私人参考))

模拟器于是包含RobotUi(模拟器是一个模型)和SimulatorDisplay(收集= 视图 )在执行绘画方法时遍历UI对象。 RobotData将隐藏在RobotUi内部。

+0

我实际上实现了MVC。我只是没有插入图表,因为我认为这会增加复杂性。 SimulatorDisplay对象是模拟器的观察者(不需要被动视图和模型之间的控制器)。显示获得每个更新()的模拟器对象的引用。但是如何获得这些信息来打印机器人而不需要获得完整的机器人? (例如,我不想要它的速度和电机配置)。 – Kevin 2011-05-18 10:46:49

+0

您编辑的建议与我图中的'最初想法'类似(我的Robot实现了一个GuiRobot接口,并且仅将其传递给SimulatorDisplay)。我已经决定采用这种方式 - 用一个RobotUi包装机器人,这将减少公共接口 - 一个供GUI使用的接口。 – Kevin 2011-05-19 07:22:57

2

我想你应该通过接口合约来设计这个。

我会让你的墙壁,机器人和传感器成为用户界面需要了解的各种“事物”的实现。只有那些界面应该在用户界面和你的模型之间共享。

例如,机器人,传感器应实行所谓的打印接口:

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?你可以让每个实体实现访问者模式的接受部分,并让你的打印代码成为一个特殊的实现,它只需要更深入地了解每个实体所做的事情就可以得到它所需要的东西......这不是我会做的,但是它可能适合你...

+0

谢谢。我已经尝试了你的第一个建议。但是,由于每个组件(机器人,墙壁和传感器)具有不同的打印属性(机器人具有getDirection,传感器具有getRange),所以我最终为每个组件打印了一个Printable接口:PrintableRobot,PrintableSensor等图表的底部。我不确定这是否好。 – Kevin 2011-05-18 11:23:41

+0

你可以看看访客模式,我会修改我的帖子... – 2011-05-18 11:28:30

+0

我重新进行了尝试并使用访问者模式。然而,我得出的结论是,访问者模式的功能是为类添加功能,但是这个功能驻留在另一个“访问者”类中。它不会隐藏GUI代码中的非GUI方法(访问者将引用一个Robot)。话虽如此,我会记住访客模式,因为我可以看到它是如何适用于这个问题的。谢谢。 – Kevin 2011-05-19 07:15:34