2017-09-16 1 views
0

J'essaie de trouver le moyen optimal de créer/utiliser le modèle de modèle MVC. J'ai une liste (database) de Person s et un View qui représente des données partielles de certain Person. La question est: Si j'ai une grande base de données qui contient une grande quantité de données par personne pour cette vue, ou devrais-je utiliser Database directement comme modèle?Java Swing MVC - meilleure pratique à implémenter Modèle

Je vais avoir différentes vues qui représenteront différentes données de la même base de données. Est-ce que database doit être un modèle pour TOUTES les vues ou dois-je créer de petits modèles pour chaque panneau de vue?

Voici un petit exemple avec panneau 1 vue et database directement en tant que modèle pour tous les panneaux d'affichage:

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; 
    } 

} 

Base de données.java (modèle)

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 
    } 

} 

Comme vous pouvez le voir, le panneau view ne représente que 2/3 des champs de Person. Dois-je implémenter un modèle séparé pour ce panneau de vue qui représente seulement String name et int age de Person ou je devrais laisser tout comme il?

Répondre

2

Comme vous pouvez le voir, le panneau d'affichage représente seulement 2/3 champs de la personne. Dois-je implémenter un modèle séparé pour ce panneau de vue qui ne représente que le nom de chaîne et int age de la personne ou je devrais laisser tout comme ça?

Je vous suggère de laisser le modèle tel quel. C'est l'un des avantages de MVC, qu'un seul modèle peut être affiché de différentes façons, ce qui signifie qu'il ne peut afficher qu'une partie de l'état du modèle, comme vous le faites ou l'affichez avec une bibliothèque ou plate-forme complètement différente (par exemple, Android). Aussi, et plus important encore, de cette façon, une modification du modèle unique est reflétée dans toutes les vues qui partagent le même modèle.

+1

Voir aussi cet exemple [https://stackoverflow.com/a/13919878/230513]. – trashgod