【问题标题】:Interface between a 'model' and 'view'“模型”和“视图”之间的接口
【发布时间】:2011-07-18 23:05:04
【问题描述】:

一个程序有一个视图和一个模型(松散地使用术语),其中视图正在观察模型。模型有一些状态,视图有一些映射到状态的 jpanel(有些状态每个都有几个对应的 jpanel)。使用卡片布局,一次显示一个 jpanel,状态更改或状态内的更改会将当前 jpanel 换成另一个。 program 有效,但是对于视图和模型来说,假设恰好有 5 个状态和 7 个视图似乎是不好的做法。这怎么可能实现。


class Model implements Observable {
  State A, B, C;
  final int VIEW_A = 0, VIEW_B = 1, VIEW_C0 = 2, VIEW_C1 = 3; 
  int stateView;

//argument will be one of the final ints above void setStateView(int stateView) { this.stateView = stateView; notifyObservers(); }

void getStateView() { return stateView; } }

class View implements Observer { void update(Observable o) { //will use one of the ints above to identify the correct jPanel to display setJPanel ( o.getStateView() ); } }

我认识到上面的代码是一种糟糕的处理方式。这就是我在这里的原因。帮忙?

【问题讨论】:

    标签: java model-view-controller interface observer-pattern


    【解决方案1】:

    一些事情:

    1. 在使用 model 维护状态时,您正确地使用了 MVC 设计模式。

    2. 假设只有 5 个状态当然没问题如果只有 5 个状态。我不同意你正在使用的另一种做法。我不会使用一堆final int 声明,而是定义一个代表您的状态的enum。我认为这可能是您认为您的程序丑陋的主要原因。在我看来,这是您决定不使用enum 的原因。

    3. 这种设计不是很可扩展。如果你最终需要 147 个州怎么办?这是需要考虑的事情。一种选择是使用除单个整数之外的其他内容作为您的状态描述符。由于我不知道你在设计什么,所以我很难在这一点上给出好的建议。

    编辑:解决另一个建议使用中介者模式的答案:我认为这对于这个简单的应用程序来说太过分了。您的模型很简单,并且您对状态的维护并不过分复杂。设计固然重要,但在设计上过度使用也会导致陷阱。

    祝你好运,

    -tjw

    【讨论】:

    • 我正在使用状态模式和具有 enter()、exit()、execute()、nextState()、reset() 方法的状态接口。这对这种类型的程序有好处吗?感谢您的意见,非常感谢。
    • 再一次,我对您的应用程序的高级设计要求了解得不够多,无法告诉您最佳选择是什么。这个特定应用程序成功的最佳指标是您正在思考设计、提出问题并利用现有的、经过实战考验的设计模式。虽然总有一种最佳方式来做某事,但这种最佳方式在必须做出决定时几乎是未知的。看来您正在以理智,合乎逻辑的方式处理事情;我在回答中写下了我的担忧。
    【解决方案2】:

    在中间插入一个类,该类仅负责将状态映射到视图。让这个类通过告诉视图显示哪个面板来对状态变化做出反应。这将映射逻辑保持在一个地方——模型对视图一无所知,视图对状态一无所知。这是Mediator 模式的变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多