Question

J'écris une application Swing, et plus ma précédente question , se sont installés sur l'utilisation du modèle de la Model-View-Presenter pour séparer l'interface utilisateur de la logique métier.

Quand mon application démarre, il exécute le code suivant:

Model model = new BasicModel();
Presenter presenter = new Presenter(model);
View view = new SwingView(presenter);
presenter.setView(view);

presenter.init();

qui crée l'interface utilisateur. Les événements sont générés par le View et déléguées au Presenter. Le Model manipule et met à jour le JDialog la conséquence Preferences.

J'ai besoin Pour gérer certains événements, afin d'obtenir de plus amples informations de l'utilisateur. Dans le cas de ces événements, je crois qu'il est approprié pour la vue Swing pour frayer une nouvelle fenêtre <=>.

Une ligne de pensée me fait sentir que cela pourrait être le code approprié dans le Orignal <=>:

public void handlePreferences() {
    Preferences prefs = view.getPreferences();
    model.setPreferences(prefs);
}

Ainsi, le contenu de chaque <=> doivent représenter un objet distinct qui doit être extraite de la mise à jour et à <=> la <=>. Toutefois, cela laisse la question: puis-je créer une nouvelle manipulation pour représenter <=> l'objet et une nouvelle <=> pour l'événement dans <=> que <=>

Il me semble que la création d'une nouvelle et <=> interne aux <=> forces originales me <=> faire beaucoup de travail qui serait plus difficile au port si je voulais changer l'interface utilisateur pour utiliser JSF, par exemple.

S'il vous plaît ne hésitez pas à ajouter des commentaires des éclaircissements.

Était-ce utile?

La solution

Bien qu'il soit rare d'avoir des modèles de conception « imbriquées » il est pas nécessaire dans votre cas. Dessin sur les autres réponses:

Modèle
- Contient toutes les données réelles, variables, objets
- sait comment définir ses valeurs de données stockées sur les nouvelles valeurs
- répond aux commandes (appels de méthode)
- a méthode setPreferences (valeur1, valeur2, valeur3 ...);

Afficher - est le IO pour l'application, juste sortie et entrée
- il ne peut fonctionner que sur son auto, son état
- il maintient les variables locales et les objets, par exemple. il a JButton, JMenus, compteurs int ...
- il est sait comment informer le présentateur de changement d'état
- son état est visible au présentateur, ou révélé par la méthode
appel - répond aux commandes (appels de méthode)
- sait comment obtenir les préférences de l'utilisateur
- a procédé askForPrefs ();
- a procédé getPrefState ();

Présentateur - Répondre aux changements d'état
- fait tout le décider, il dit aux autres objets ce qu'il faut faire (pas comment le faire)
- sait quand les préférences sont nécessaires
- sait où trouver de nouvelles préférences et où les mettre
- a procédé newPrefsAvailable ();

  

... pour obtenir de plus amples informations de l'utilisateur. Dans le cas de ces événements, je crois qu'il est approprié pour la vue Swing pour frayer une nouvelle fenêtre JDialog.

Présentateur - vérifie le modèle, détermine de nouvelles préférences sont nécessaires
Présentateur - this.myView.askForPrefs (); // dit afin de demander à l'utilisateur des valeurs pref
View.askForPrefs - affiche une boîte JDialog, retVals stocké dans la vue comme un changement d'état
Vue - this.myPresenter.newPrefsAvailable ();
Présentateur - répond avec this.myModel.setPreferences (this.myView.getPrefState ());
Model.setPreferences - modifie les valeurs stockées à View.getPrefState ()
Présentateur - vérifie le modèle - détermine les préférences sont bonnes
Présentateur - continue sur

Le JDialog est traité comme une simple extension de la vue, il est membre de la vue comme un JButton serait. Le modèle a les valeurs de préférence réelles autorisées, et la vue a des variables locales qui représentent l'état de la JDialog.

Autres conseils

Mon conseil serait de penser à ce que ces « préférences » sont fondamentalement. Sont-ils partie de la logique métier sous-jacente? Si oui, alors ils devraient faire partie du modèle structre. Sont-ils de façon préférée spécifiant l'utilisateur d'interagir avec les données de l'entreprise? Ensuite, ils doivent faire partie de la vue. Cela peut sembler théorique, mais dans mon expérience, il permet d'économiser beaucoup de maux de tête à la fin.

Si vous ne pouvez pas travailler que sur alors où les préférences sont enregistrées vous donne un autre indice. si elles doivent être enregistrées avec les données manipulées alors ils sont probablement une partie de la logique métier. Si elles sont enregistrées dans le fichier de préférences personnelles de l'utilisateur alors ils ne sont pas, et doivent être considérés comme vue.

Non, vous n'avez pas besoin d'un autre « modèle » juste pour les Préférences

Il suffit de passer le présentateur et le mode comme arguments dans le constructeur de la JDialog. Il est plus facile de programmer une grande application Swing quand il y a

  • 1 modèle
  • 1 unité de commande (qui lui-même peut contenir plus petits)
  • plusieurs vues (mais sur les classes mêmes données / modèle)

Notez que 1 modèle! = 1 classe. Le « modèle » d'une application Swing peut effectivement être un « arbre » de différentes classes « modèles » qui ont une « racine » commune.

Dans votre cas, vous devez

modèle "Global" -.> (Contient) modèle "Préférences"

scroll top