2012-07-06 6 views
30

Czy ktoś może podać konkretny przykład kodu MVP w działaniu?Przykładowy kod betonowy MVP

ten obejmowałby następujące 3 typy klas i jak nazywają metody wzajemnie, aby osiągnąć wzorzec i proces/odpowiedzi na odpowiedź po stronie klienta:

  • modelu - pewnego rodzaju obiektu wartości (VO)
  • Zobacz - reprezentuje lub generuje UI
  • Prezentery - logikę biznesową
+2

SO nie działa w ten sposób; nie jest to forum dyskusyjne ani ogólne forum samouczków. Przeczytaj [FAQ] i [Ask]. Ponadto na pytanie można łatwo odpowiedzieć za pomocą wyszukiwarki Google. –

+0

Boczny krok, ale czy MVP to kolejna nazwa MVC? – Esko

+1

@Esko Istnieją różnice: http://blogs.infragistics.com/blogs/todd_snyder/archive/2007/10/17/mvc-or-mvp-pattern-whats-the-difference.aspx –

Odpowiedz

50

MVP to mój ulubiony wzór do stworzenia interfejsu użytkownika.

Duża różnica między MVP i MVC polega na sposobie obsługi widoku.

  • W MVC kontroler manipuluje widokiem, dbając o renderowanie w widoku części działań użytkownika i modelu. Oznacza to, że kontroler i widok mają "zwarte sprzężenie".
  • W MVP prezenter zajmuje się zadaniami użytkownika, model jest dzielony między prezenterem a widokiem. Tak więc widok renderuje UI zgodnie z modelem, czasami widok może mieć akcje, które można wywołać od prezentera. Presenter i View mogą mieć zdefiniowane umowy na interfejsy, aby je "luźno powiązać". Można na przykład utworzyć interfejs użytkownika View for Java Swing, a inny interfejs JavaFX. Lub jeśli zmienia się połączenie ze źródłem danych, wystarczy zaktualizować prezentera.

Istnieje wiele stylów do zaprogramowania MVP.

W formalny sposób polega na tworzeniu interfejsów dla każdego elementu wzorca projektowego.

/*-- 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

_ To oznacza, że ​​kontroler i widok mają "szczelne połączenie" ._ Dzięki. To jest jedna rzecz, o którą się zastanawiam z MVC. Również miło z twojej strony, że umieściłeś kiedykolwiek jasny przykład Javy MVP. –

+11

Chciałbym obiektu: getPresenter(). GetModel(). SetUser (jTextField1.getText()); nie jest linią, która powinna być obecna w widoku. – cproinger

+9

dodatkowo updateModelFromView i updateViewFromModel nie są metodami, których można się spodziewać po widoku w MVP. prezenter powinien posiadać cały prezentacyjny-logik. widok nie powinien mieć żadnego dostępu do modelu. – cproinger