我正在寻找有关我的MVC设计的帮助,我哪里出错了,如果有的话,那就是我慢慢进步的方式。
许多可以在自己的线程中工作的仪表,我的问题是将该程序正确地划分为视图和模型。
这是我到目前为止所提出的:
public class BarGaugeModel {
private int speed;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
BarGaugeModel.java
public class DashboardViewModel {
BarGaugeModel fuelGauge = new BarGaugeModel();
public BarGaugeModel getFuelGauge() {
return fuelGauge;
}
}
DashboardViewModel.java (将包含所有型号)
public class BarGauge extends JPanel {
private JLabel speed = new JLabel();
public int getSpeed() {
return Integer.parseInt(speed.getText());
}
public void setSpeed(int speed) {
this.speed.setText(speed+"");
}
}
BarGauge.java
public class DashboardView extends JFrame {
BarGauge barGauge = new BarGauge();
public void DashBoardView(){
this.setSize(new Dimension(100,100));
this.add(barGauge);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
DashboardView.java (将创建所有视图组件并添加到此jframe)
public class Main {
public static void main(String[] args) {
DashboardView dashboardView = new DashboardView();
DashboardViewModel dashboardViewModel = new DashboardViewModel();
DashboardController dashboardController = new DashboardController(dashboardView, dashboardViewModel);
dashboardView.setVisible(true);
}
}
Main.java
{{1}}
这些仪表中的每一个也都有一个手动输入供用户输入,我也不太确定该输入应该包含在哪个视图中,也可能完全独立。
答案 0 :(得分:2)
首先,在纯MVC中,模型和视图对彼此一无所知,这一切都由控制器控制,控制器充当它们之间的路由器,监听更改并在视图之间前后转发这些更新和模型。
作为一般建议,您应该首先定义需要由模型,控制器和视图维护的合同,以便它们一起工作,就个人而言,我从interfaces
开始,因为这种解耦实现细节并强制你专注于“真正”需要做什么,而不是你“可以”做什么,因为实现副作用(例如控制器能够从视图中添加/删除组件)
这还应该包括所有观察者模式/听众,这是为了提供通信发生的通知渠道所需要的
您可能还需要定义什么是线程安全的,哪些不是,例如,当您的“终极”设计可能需要模型从不同线程获取信息时,如果在同一线程上生成更新或应该他们被同步回一个线程?无论如何,实际上是谁的责任是什么(暗示,在大多数情况下,这是观点)
通过这个过程,您应该寻找重叠的细节,这些细节可以进一步简化为通用功能(当可以将这些模型简化为单个公共{{1}时,没有任何点具有public int getValue()
的两个不同模型在大多数情况下......)
在您不需要时,我也会小心转换“数据”,例如在您的interface
课程中,您采取的速度是BarGauge
,但是转向把它变成int
,个人而言,我会把它留作String
而只是改变你呈现它的方式,它会省去很多麻烦,而且观点责任应该是呈现状态,所以我倾向于将其保留为原始格式,只在需要时将其转换为演示文稿。
当做这样的事情时,我尝试做的事情之一就是关注谁对什么负责,例如......
当更新来自线程时,它进入模型,模型根据线程的输入更新其状态,它通知控制器,控制器通知视图然后更新
int
当用户输入数据时,数据通过视图传递给控制器,控制器通知模型,模型更新其状态,这反过来可能会生成返回行程,因此视图可以根据模型决定的内容自行更新与输入有关(即拒绝或修改它或因为它更新了模型的其他状态)
Thread -> Model -> Controller -> View
分成较小的视图,然后将其重新组合在一起将视图组件创建为JPanels作为简单的仪表,然后将它们组合到JFrame中的一个视图中,如我在问题中所示?
一般情况下,是的,但是您需要了解的一件事是,视图可以充当其他控制器的控制器 - 这意味着您可以拥有“控制面板”视图,这实际上是其他控件的容器仪表控件(假设您允许控制器公开视图和模型)
我会做的是从User -> View -> Controller -> Model {-> Controller -> View}
(可能是Controller
)的基本概念开始
View
这意味着我可以将任意数量的“控制器”传递到我的“控制窗格”视图,它可以获取每个“视图”并将它们添加到自身以显示...作为基本想法。