MVP的具体代码示例

有人可以提供具体的(实际的Java代码)MVP实例吗?

这将包括以下3种类型,以及他们如何调用彼此的方法来实现模式和流程/响应客户端响应:

  • 模型 - 某种价值对象(VO)
  • 视图 - 表示或生成用户界面
  • 演示者 - 业务逻辑

  • MVP是我最喜欢的创建UI的设计模式。

    MVP和MVC最大的区别就是如何处理视图。

  • 在MVC中,控制器操纵视图,负责在用户操作和模型的视图部分中呈现视图。 这意味着Controller和View具有“紧密耦合”。
  • 在MVP中,Presenter负责处理用户任务,模型由Presenter和View共享。 所以视图根据模型渲染UI,有时视图可以有从Presenter调用的动作。 Presenter和View可以有一个定义的接口契约来使它们“松耦合”。 例如,您可以创建一个Java Swing UI视图和另一个JavaFX UI视图。 或者,如果连接到数据源发生更改,则只需更新演示者。
  • 有许多风格来编制MVP。

    以正式方式,包括为设计模式的每个元素创建接口。

    /*-- 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();
                }
            });
        }
    }
    
    链接地址: http://www.djcxy.com/p/30211.html

    上一篇: Concrete Code Example of MVP

    下一篇: Is ASP.net Model View Presenter worth the time?