我正在尝试设计机器人模拟器的GUI前端(实际上是一个简单的游戏)。但是,我不知道将模拟器组件(例如机器人和墙壁)传递给显示器的最佳方法。我想要隐藏组件的非显示方向信息(例如机器人质量),但仍然能够识别每个组件的打印,即当我绘制组件时,我想以不同的方式绘制机器人我做墙壁(也许机器人会有一个名牌或其他东西)。
这张照片有望解释设计:
也许我还没有找到一个有用的设计模式......
答案 0 :(得分:2)
我认为你应该通过接口合同来设计它。
我会让您的墙壁,机器人和传感器成为UI需要了解的各种“事物”的实现。只应在UI和模型之间共享这些接口。
例如,Robot,Sensor应该实现一个名为Printable的接口:
public interface Printable {
Shap getShape();
}
Wall应该实现扩展接口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等是对界面基本概念的误解。界面应该更多地是关于“什么东西提供或如何使用它”而不是具体实现如何实现。通过将Robot,Wall等置于Printable中,您可以指示实施。
除此之外,您考虑过Visitor Pattern ??您可以让每个实体实现访问者模式的接受部分,并让您的打印代码成为一个特殊的实现,只需要从每个实体的更深层次的知识中获取所需的内容....这不是我会做的,而是它可能适合你...
答案 1 :(得分:1)
检查模型 - 视图 - 控制器设计模式。它分离数据(机器人的速度,大小......),演示(机器人的形状和绘画方法)和行为(增加机器人速度)。
回答你的问题 - 隐藏类API部分的最简单方法是将这个类分成多个部分(模型,视图,控制器)并根据某种模式(MVC或模型 - 视图 - 演示者)连接它们。他们很多都是。)
编辑:很抱歉,我没有提供任何示例。我的建议只是将机器人分成两类: