程序具有视图和模型(使用松散术语),其中视图观察模型。该模型具有少数状态,并且视图具有映射到状态的少数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() );
}
}
我认识到上面的代码是一种糟糕的方式来解决这个问题。这就是我在这里的原因。帮助
答案 0 :(得分:1)
在中间插入一个类,其唯一责任是将状态映射到视图。让这个类通过告诉视图显示哪个面板来对状态更改做出反应。这使映射逻辑保持在一个位置 - 模型对视图一无所知,并且视图对状态一无所知。这是Mediator模式的变体。
答案 1 :(得分:1)
一些事情:
在使用model
维护状态时,您正确使用MVC设计模式。
假设只有5个状态肯定可以如果只有5个状态。我不同意你正在使用的另一种做法。我会定义一个代表你的州的final int
,而不是使用一堆enum
声明。我认为这可能是你认为你的程序很丑的一个主要原因。在我看来,这是你决定不使用enum
的原因。
这种设计不是很容易扩展。如果您最终需要147个州怎么办?这是值得思考的问题。一种选择是使用除单个整数之外的东西作为状态描述符。由于我不知道你在设计什么,所以我很难就这一点提出好的建议。
编辑:解决另一个发布建议使用Mediator模式的答案:我认为这对于这个简单的应用程序来说太过分了。您的模型是直截了当的,您对状态的维护并不过分复杂。设计很重要,但是你的设计过度使用也会导致陷阱。
祝你好运,-tjw