Java a';型号';和';视图';

Java a';型号';和';视图';,java,model-view-controller,interface,observer-pattern,Java,Model View Controller,Interface,Observer Pattern,程序有一个视图和一个模型(松散地使用术语),视图在其中观察模型。模型有几个状态,视图有几个映射到状态的JPanel(有些状态每个都有几个对应的JPanel)。使用cardlayout,一次显示一个jpanel,状态更改或某个状态内的更改会将当前jpanel替换为另一个jpanel。prm是有效的,但是视图和模型假设正好有5个状态和7个视图,这似乎是一种不好的做法。如何实现这一点。 class Model implements Observable { State A, B, C; fi

程序有一个视图和一个模型(松散地使用术语),视图在其中观察模型。模型有几个状态,视图有几个映射到状态的JPanel(有些状态每个都有几个对应的JPanel)。使用cardlayout,一次显示一个jpanel,状态更改或某个状态内的更改会将当前jpanel替换为另一个jpanel。prm是有效的,但是视图和模型假设正好有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() ); } }

类模型实现了可观察的{
A、B、C国;
最终内部视图A=0,视图B=1,视图C0=2,视图C1=3;
int stateView

//参数将是上面最后的整数之一 void setStateView(int stateView){ this.stateView=stateView; 通知观察员(); }

void getStateView(){return stateView;} }

类视图实现了Observer{ 无效更新(可观测o){ //将使用上面的一个INT来识别要显示的正确jPanel setJPanel(o.getStateView()); } }


我认识到上面的代码是一种可怕的方式。这就是我来这里的原因。帮助?

< P>插入中间的一个类,负责映射状态到视图。让此类通过告诉视图要显示哪个面板来响应状态更改。这使得映射逻辑保持在一个地方——模型对视图一无所知,视图对状态一无所知。这是模式的一种变体。

有几点:

  • 在使用
    模型
    维护状态时,您正确地使用了MVC设计模式

  • 如果只有5个状态,那么假设只有5个状态当然是可以的。我不同意你正在使用的另一种做法。我将定义一个表示您的状态的
    enum
    ,而不是使用一堆
    final int
    声明。我认为这可能是你认为你的节目很难看的一个主要原因。在我看来,这是您决定不使用
    enum
    的原因

  • 这种设计的可扩展性不强。如果你最终需要147个州呢?这是值得思考的。一种选择是使用一个整数以外的内容作为状态描述符。因为我不知道你在设计什么,所以我很难在这一点上给出好的建议

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

    祝你好运


    -tjw

    我将状态模式与具有enter()、exit()、execute()、nextState()和reset()方法的状态接口一起使用。这对这类节目有好处吗?非常感谢您的输入,非常感谢。再说一次,我对您的应用程序的高级设计要求了解得不够,无法告诉您最佳选择是什么。此特定应用程序成功的最佳指标是您正在思考设计、提出问题并利用现有的、经过战斗测试的设计模式。虽然总是有一种最好的方法来做某事,但在做出决定的时候,这种最好的方法几乎从来都不为人所知。你似乎在以理智、合乎逻辑的方式做事;我在回答中写下了我的担忧。