隐藏类的公共方法/接口的最简单方法

时间:2011-05-18 09:54:19

标签: java model-view-controller design-patterns

我正在尝试设计机器人模拟器的GUI前端(实际上是一个简单的游戏)。但是,我不知道将模拟器组件(例如机器人和墙壁)传递给显示器的最佳方法。我想要隐藏组件的非显示方向信息(例如机器人质量),但仍然能够识别每个组件的打印,即当我绘制组件时,我想以不同的方式绘制机器人我做墙壁(也许机器人会有一个名牌或其他东西)。

这张照片有望解释设计: Program Design

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

2 个答案:

答案 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或模型 - 视图 - 演示者)连接它们。他们很多都是。)

编辑:很抱歉,我没有提供任何示例。我的建议只是将机器人分成两类:

  • RobotData (包含速度,大小,...提供getter / setter,简单的java bean对象)
  • RobotUi (提供形状方法(使用RobotData的私人参考))
然后,模拟器包含RobotUi的集合(模拟器是模型),SimulatorDisplay(= view )在执行绘制方法时遍历UI对象。 RobotData将隐藏在RobotUi中。