“模型”和“视图”之间的接口

时间:2011-03-20 00:12:06

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

程序具有视图和模型(使用松散术语),其中视图观察模型。该模型具有少数状态,并且视图具有映射到状态的少数jpanel(一些状态各自具有若干对应的jpanel)。使用cardlayout,一次显示一个jpanel,状态更改或状态更改将换出另一个jpanel。 pr ogra m有效,但视图和模型假设有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() ); } }

我认识到上面的代码是一种糟糕的方式来解决这个问题。这就是我在这里的原因。帮助

2 个答案:

答案 0 :(得分:1)

在中间插入一个类,其唯一责任是将状态映射到视图。让这个类通过告诉视图显示哪个面板来对状态更改做出反应。这使映射逻辑保持在一个位置 - 模型对视图一无所知,并且视图对状态一无所知。这是Mediator模式的变体。

答案 1 :(得分:1)

一些事情:

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

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

  3. 这种设计不是很容易扩展。如果您最终需要147个州怎么办?这是值得思考的问题。一种选择是使用除单个整数之外的东西作为状态描述符。由于我不知道你在设计什么,所以我很难就这一点提出好的建议。

  4. 编辑:解决另一个发布建议使用Mediator模式的答案:我认为这对于这个简单的应用程序来说太过分了。您的模型是直截了当的,您对状态的维护并不过分复杂。设计很重要,但是你的设计过度使用也会导致陷阱。

    祝你好运,

    -tjw