[英]Java Swing MVC - best practice to implement Model
我試圖找出創建/使用MVC模式模型的最佳方法。 我有一個Person
的列表( database
)和一個View
,它表示某些Person
部分數據。
問題是:如果我有一個大型數據庫,每個人包含大量數據,而我的視圖面板僅表示一個人的少量數據,那么我應該創建一個僅維護該視圖可表示數據的模型嗎?我應該直接將Database
用作模型嗎?
我將有不同的視圖,分別代表同一數據庫的不同數據。 database
應該是所有視圖的模型,還是我需要為每個視圖面板創建小型模型?
這是一個小示例,其中一個視圖面板和database
直接作為所有視圖面板的模型:
Main.java
import java.awt.EventQueue;
import javax.swing.JFrame;
public class Main {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
new Main();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
initialize();
}
private void initialize() {
Database.getInstance(); // model ?
View view = new View(); // view
Controller controller = new Controller(); // controller
Database.getInstance().addObserver(view);
view.addController(controller);
frame = new JFrame();
frame.add(view.createView());
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
Person.java
public class Person {
private String name;
private int age;
private String sex;
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
}
Database.java(模型)
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
public class Database extends Observable {
private static Database instance = null;
private List<Person> database = new ArrayList<Person>();
private Database() {
this.database = createDataBase();
}
public static Database getInstance() {
if (instance != null)
return instance;
else
return instance = new Database();
}
private List<Person> createDataBase() {
List<Person> database = new ArrayList<Person>();
database.add(new Person("A", 25, "male"));
return database;
}
public List<Person> getDatabase() {
return database;
}
public void changeData(String name, int age, String sex) {
database.get(0).setName(name);
database.get(0).setAge(age);
database.get(0).setSex(sex);
setChanged();
notifyObservers();
}
}
View.java
import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class View implements Observer {
private JLabel nameLabel;
private JLabel ageLabel;
private JButton changeDataButton;
public View() {
this.nameLabel = new JLabel();
this.ageLabel = new JLabel();
this.changeDataButton = new JButton("Change Data");
}
public JPanel createView() {
JPanel viewPanel = new JPanel(new BorderLayout());
viewPanel.add(new JLabel("View only name and age"), BorderLayout.NORTH);
viewPanel.add(nameLabel, BorderLayout.WEST);
viewPanel.add(ageLabel, BorderLayout.EAST);
viewPanel.add(changeDataButton, BorderLayout.SOUTH);
inizializeView();
return viewPanel;
}
private void inizializeView() {
this.nameLabel.setText(Database.getInstance().getDatabase().get(0).getName());
this.ageLabel.setText("" + Database.getInstance().getDatabase().get(0).getAge());
}
public void addController(Controller controller) {
changeDataButton.addActionListener(controller);
}
@Override
public void update(Observable obs, Object obj) {
nameLabel.setText(((Database) obs).getDatabase().get(0).getName());
ageLabel.setText("" + ((Database) obs).getDatabase().get(0).getAge());
}
}
Controller.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Controller implements ActionListener {
public Controller() {
}
@Override
public void actionPerformed(ActionEvent arg0) {
Database.getInstance().changeData("B", 30, "female"); // change model
}
}
如您所見, view
面板僅代表Person
2/3字段。 我應該為此視圖面板實現一個單獨的模型,該模型僅表示String name
和Person
int age
還是應該保留所有內容?
如您所見,視圖面板僅代表Person的2/3字段。 我應該為此視圖面板實現一個單獨的模型,該模型僅表示String名稱和Person的int age還是應該保留所有內容?
我建議您保持原樣。 這是MVC的優點之一,即可以以多種不同的方式顯示一個模型,這可能意味着僅顯示模型狀態的一部分,就像您正在做的那樣,或者使用完全不同的GUI庫或平台來顯示它(例如Android)。 同樣而且更重要的是,以這種方式, 對單個模型的更改反映在共享相同模型的所有視圖中 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.