簡體   English   中英

Java Swing MVC-實現模型的最佳實踐

[英]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 namePerson int age還是應該保留所有內容?

如您所見,視圖面板僅代表Person的2/3字段。 我應該為此視圖面板實現一個單獨的模型,該模型僅表示String名稱和Person的int age還是應該保留所有內容?

我建議您保持原樣。 這是MVC的優點之一,即可以以多種不同的方式顯示一個模型,這可能意味着僅顯示模型狀態的一部分,就像您正在做的那樣,或者使用完全不同的GUI庫或平台來顯示它(例如Android)。 同樣而且更重要的是,以這種方式, 對單個模型的更改反映在共享相同模型的所有視圖中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM