2012-07-06 14 views
30

Qualcuno può fornire un esempio concreto (codice Java effettivo) di MVP in azione?Codice concreto Esempio di MVP

Ciò include i seguenti 3 tipi di classi e come si chiamano l'un l'altro metodi per raggiungere il modello e di processo/rispondere a una risposta sul lato client:

  • Modello - qualche tipo di oggetto valore (VO)
  • View - rappresenta o genera l'interfaccia utente
  • presentatori - la logica di business
+2

SO non funziona in questo modo; non è una discussione o un forum di tutorial generale. Per favore leggi le [FAQ] e [Chiedi]. Inoltre, la tua domanda può essere facilmente risolta con una ricerca su Google. –

+0

Passo laterale qui, ma MVP è ancora un altro nome per MVC? – Esko

+1

@Esko Ci sono differenze: http://blogs.infragistics.com/blogs/todd_snyder/archive/2007/10/17/mvc-or-mvp-pattern-whats-the-difference.aspx –

risposta

50

MVP è il mio modello di progettazione preferito per creare un'interfaccia utente.

La grande differenza tra MVP e MVC è come gestire la vista.

  • In MVC, il controllore manipola la vista, curando come eseguire il rendering nella vista delle parti delle azioni e del modello dell'utente. Ciò significa che il controller e la vista hanno un "accoppiamento stretto".
  • In MVP, il Presenter si occupa delle attività dell'utente, il modello è condiviso tra Presenter e Vista. Pertanto, la vista esegue il rendering dell'interfaccia utente in base al modello, a volte la vista può avere azioni da chiamare dal Presenter. Presenter e View possono avere contratti di interfaccia definiti per renderli "loose coupling". Ad esempio, è possibile creare un'interfaccia utente View for Java Swing e un'altra per l'interfaccia utente JavaFX. O se la connessione all'origine dati cambia, è sufficiente aggiornare il presentatore.

Ci sono molti stili per programmare l'MVP.

In modo formale, consiste nel creare interfacce per ogni elemento del modello di progettazione.

/*-- file: Application.java --*/ 
import javax.swing.JOptionPane; 

/** 
* 
* @author danLeon 
*/ 
interface LoginModel { 

    String getUser(); 

    void setUser(String user); 
} 

class MyLoginModel implements LoginModel { 

    String user; 

    @Override 
    public String getUser() { 
     return user; 
    } 

    @Override 
    public void setUser(String user) { 
     this.user = user; 
    } 
} 

interface LoginView { 

    LoginPresenter getPresenter(); 

    void setPresenter(LoginPresenter loginPresenter); 

    void updateModelFromView(); 

    void updateViewFromModel(); 

    void open(); 

    void close(); 

    void userRejected(); 
} 

class MyLoginView extends javax.swing.JFrame implements LoginView { 

    private LoginPresenter loginPresenter; 

    /** 
    * Creates new form MyLoginView 
    */ 
    public MyLoginView() { 
     initComponents(); 
    } 


    @SuppressWarnings("unchecked") 
    private void initComponents() { 
     java.awt.GridBagConstraints gridBagConstraints; 

     jLabel1 = new javax.swing.JLabel(); 
     jTextField1 = new javax.swing.JTextField(); 
     jLabel2 = new javax.swing.JLabel(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setBounds(new java.awt.Rectangle(0, 0, 0, 0)); 
     java.awt.GridBagLayout layout = new java.awt.GridBagLayout(); 
     layout.columnWidths = new int[] {0, 7, 0}; 
     layout.rowHeights = new int[] {0, 7, 0, 7, 0}; 
     getContentPane().setLayout(layout); 

     jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N 
     jLabel1.setText("Welcome"); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.gridwidth = 3; 
     getContentPane().add(jLabel1, gridBagConstraints); 

     jTextField1.setColumns(13); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 2; 
     gridBagConstraints.gridy = 2; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 
     getContentPane().add(jTextField1, gridBagConstraints); 

     jLabel2.setText("User"); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 2; 
     getContentPane().add(jLabel2, gridBagConstraints); 

     jButton1.setText("Login"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 2; 
     gridBagConstraints.gridy = 4; 
     getContentPane().add(jButton1, gridBagConstraints); 

     pack(); 
    } 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     getPresenter().login(); 
    } 

    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JTextField jTextField1; 


    @Override 
    public void updateModelFromView() { 
     getPresenter().getModel().setUser(jTextField1.getText()); 
    } 

    @Override 
    public void updateViewFromModel() { 
     jTextField1.setText(getPresenter().getModel().getUser()); 
    } 

    @Override 
    public void open() { 
     setVisible(true); 
     jTextField1.selectAll(); 
     jTextField1.requestFocus(); 
    } 

    @Override 
    public void close() { 
     dispose(); 
    } 

    @Override 
    public void userRejected() { 
     jLabel1.setText("Try again!"); 
     jTextField1.selectAll(); 
     jTextField1.requestFocus(); 
    } 

    @Override 
    public LoginPresenter getPresenter() { 
     return loginPresenter; 
    } 

    @Override 
    public void setPresenter(LoginPresenter loginPresenter) { 
     this.loginPresenter = loginPresenter; 
    } 
} 

interface LoginPresenter { 

    LoginModel getModel(); 

    void setModel(LoginModel loginModel); 

    LoginView getView(); 

    void setView(LoginView loginView); 

    void setOnLogin(Runnable onLogin); 

    void run(); 

    void login(); 
} 

class MyLoginPresenter implements LoginPresenter { 

    LoginModel loginModel; 
    LoginView loginView; 
    private Runnable onLogin; 

    @Override 
    public LoginModel getModel() { 
     return loginModel; 
    } 

    @Override 
    public void setModel(LoginModel loginModel) { 
     this.loginModel = loginModel; 
    } 

    @Override 
    public LoginView getView() { 
     return loginView; 
    } 

    @Override 
    public void setView(LoginView loginView) { 
     this.loginView = loginView; 
    } 

    @Override 
    public void setOnLogin(Runnable onLogin) { 
     this.onLogin = onLogin; 
    } 

    @Override 
    public void run() { 
     loginModel.setUser("previousUser"); 
     loginView.setPresenter(this); 
     loginView.updateViewFromModel(); 
     loginView.open(); 
    } 

    @Override 
    public void login() { 
     loginView.updateModelFromView(); 
     if (loginModel.getUser().equalsIgnoreCase("root")) { 
      loginView.close(); 
      loginView.setPresenter(null);// for memory sanity. 
      onLogin.run(); 
     } else { 
      loginView.userRejected(); 
     } 
    } 
} 

public class Application { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       LoginModel loginModel = new MyLoginModel(); 
       LoginPresenter loginPresenter = new MyLoginPresenter(); 
       loginPresenter.setModel(loginModel); 
       LoginView loginView = new MyLoginView(); 
       loginPresenter.setView(loginView); 
       loginPresenter.setOnLogin(new Runnable() { 

        @Override 
        public void run() { 
         JOptionPane.showMessageDialog(null, "Welcome user!"); 
        } 
       }); 
       loginPresenter.run(); 
      } 
     }); 
    } 
} 
+3

_Che significa che il controller e la vista hanno un accoppiamento stretto ._ Grazie. Questa è una cosa che mi stavo chiedendo con MVC. Anche gentile di voi per pubblicare un esempio Java mai così chiaro di MVP. –

+11

vorrei oppormi: getPresenter(). GetModel(). SetUser (jTextField1.getText()); non è una linea che dovrebbe essere presente in una vista. – cproinger

+9

inoltre updateModelFromView e updateViewFromModel non sono metodi che ci si aspetterebbe da una vista in MVP. il presentatore dovrebbe tenere tutte le presentazioni-logik. la vista non dovrebbe essere in grado di accedere al modello in alcun modo. – cproinger