Java MVC,其中模型没有内在的视觉表示

Java MVC,其中模型没有内在的视觉表示,java,model-view-controller,visualization,strategy-pattern,Java,Model View Controller,Visualization,Strategy Pattern,我正在用Java开发一个MVC架构的应用程序。这样做极大地解耦和简化了我的代码,但问题是模型没有内在的视觉表示。也就是说,没有角色,没有特定的敌人,没有按钮,没有文本框-模型由一种类型对象的数百个实例组成。每个实例都由一个策略模式的实例控制(从技术上讲,它是一个策略模式的层次结构);它是应用程序中每个实例之间唯一的不同点。因此,理想情况下,每个实例使用的策略类型应该使其看起来与周围的其他实例略有不同 我希望避免一个巨大的if语句链,它包含数十个“实例”调用,用于检查在为该应用程序开发视图时使用的

我正在用Java开发一个MVC架构的应用程序。这样做极大地解耦和简化了我的代码,但问题是模型没有内在的视觉表示。也就是说,没有角色,没有特定的敌人,没有按钮,没有文本框-模型由一种类型对象的数百个实例组成。每个实例都由一个策略模式的实例控制(从技术上讲,它是一个策略模式的层次结构);它是应用程序中每个实例之间唯一的不同点。因此,理想情况下,每个实例使用的策略类型应该使其看起来与周围的其他实例略有不同

我希望避免一个巨大的if语句链,它包含数十个“实例”调用,用于检查在为该应用程序开发视图时使用的策略类型。我还希望使用枚举避免类似的链。关于如何在不屈服于庞大的if链的情况下表达自己的观点,有什么建议吗?关于如何正确设计视图,使其不会与策略实例紧密耦合,有什么建议吗


提前感谢您的时间

@DJClayworth提出了一个关键问题:


您是否有兴趣向用户展示选择的策略,或该策略的结果

假设两者都需要,让模型包含与策略名称、实现和描述性文本相关的枚举。该实现可以使用


在这种情况下,
enum规则
作为隐式模型用于所有三个目的。它提供了一个清晰的名称和描述,以及一个表示特定复合策略的常量。不需要任何
case
语句。

请用代码示例替换您的一些文章。您是否有兴趣向用户展示所选策略,或该策略的结果?@DJClayworth:控制模型中主要对象的策略是较简单策略的层次结构。我想展示的是每个子策略的能力。例如,如果一个模型对象移动和攻击,我希望这两种策略有一个清晰的标记。标记可以是任何东西;它可以是一种颜色,也可以是滚筒刀片上的护罩。关键是用户需要一些关于它能做什么的线索@柯克·沃尔:代码在这里没用。我必须给你我的资料的很大一部分来告诉你发生了什么。我觉得这与问题无关。我不确定我是否理解你。您是否建议我创建一个枚举器来标识不同的策略对象,其中枚举器的每个值都与可视化绑定(就像示例中的枚举规则与常量和属性绑定一样)?如果是这样,这会不会使视图和模型紧密耦合?或者提供某种类型的“属性”文件是否足以将两者解耦?不应该有新的耦合。当控制器看到已请求新策略时,应在模型中更新所选策略;然后,模型通知视图hte更改。当视图了解到模型的新策略时,它可以相应地采取行动。您的策略应该已经实现了实现新视图所需的接口。该示例的
enum
,与名称和类相关,是执行singleton属性的实现细节。“当视图了解到模型的新策略时,它可以相应地采取行动”——这是否需要if链?也就是说,“相应地行动”是否仍然需要视图运行一系列可能的策略,以查看哪种可视化最合适?让每个具体的策略实现一个具有
getMarker()
方法的接口,或者将这样的方法添加到策略本身。该方法将定义获取相关符号的方法—名称、路径甚至
图标本身。稍后,当视图需要在上下文中呈现给定的策略时,它只需调用
getMarker()
。没有决定要做;视图只是呈现模型告诉它的任何视觉表示。现在我明白了。这又回到了“没有内在的可视化”问题;模型没有自然的绘制或显示方式。也就是说,这可能是最简单的方法,如果可视化需要更改,可以在属性文件中的某个位置指定要绘制的内容。我同意。非常感谢。