2017-09-16 55 views
0

我试图找出创建/使用MVC模式模型的最佳方法。 我有一个列表(databasePerson s和一个View它代表某些Person的部分数据。Java Swing MVC - 实现的最佳实践模型

现在的问题是: 如果我有一个大型数据库,每个人都有大量数据,并且我有一个视图面板只代表一个人的一小部分数据,我应该创建一个模型来仅保存可呈现的数据为此,还是应该直接使用Database作为模型?

我将有不同的意见,这将代表同一个数据库的不同数据。 database应该是所有视图的模型还是我需要为每个视图面板创建小模型?

这里的一个小例子1个图面板和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面板只占2/3 Person领域。我应该为这个视图面板实现一个单独的模型,它只代表String nameint agePerson或者我应该离开一切吗?

回答

2

正如您所看到的,查看面板仅代表Person的2/3个字段。我应该为这个视图面板实现一个单独的模型,它只表示字符串名称和人员的整数年龄,否则我应该离开一切?

我建议你保持原样。这是MVC的好处之一,即可以用许多不同的方式显示单个模型,这可能意味着只显示模型状态的一部分,就像您正在执行或使用完全不同的GUI库或平台显示它一样(例如Android)。此外,更重要的是,通过这种方式,对单一型号的更改反映在共享相同型号的所有视图中。

+1

另请参阅此相关的[示例](https://stackoverflow.com/a/13919878/230513)。 – trashgod