zoukankan      html  css  js  c++  java
  • MVP模式

    1. 基本概念和代码

    参考:

    http://www.jianshu.com/p/50c7124f408e

    http://www.jianshu.com/p/7c4e310da409

    http://blog.csdn.net/qq_31852701/article/details/52946127

    MVP模式的代码的,写好了去看,没什么难度,但是如果自己去写,就感觉很不适应,主要还是编程思想要有一些转变 ,还是需要自己写一下

    1.1 基本概念

    Model,View,Presenter三者之间的关系是:View和Model之间没有联系,View通过接口向Presenter来传递用户操作,Model不主动和Presenter联系,被动的等着Presenter来调用其接口,Presenter通过接口和View/Model来联系。

    View <- 接口 <- Presenter ->接口 -> Model

    View -> 接口 -> Presenter <- 接口 <- Model

    
    

    1.2 伪代码

    参考链接:http://www.jianshu.com/p/50c7124f408e

    VIEW:

    interface IUserView {
    
      void setPresenter(presenter);
      void showUsers(users);
      void showDeleteUserComplete();
      void showDeleteUserError();
    
    }
    
    class UserView implements IUserView {
    
      UserPresenter presenter;
    
      // 保持对Presenter的引用,用于路由用户操作
      void setPresenter(presenter) {
          this.presenter = presenter;
      }
    
      // 将Presenter传递来的数据展示出来
      void showUsers(users) {
          draw(users);
      }
    
      // Model操作数据成功后,通过Presenter来告之View需要更新用户界面
      void showDeleteUserComplete() {
          alert("Delete User Complete");
      }
    
      // Model操作数据失败后,也是通过Presenter来告之View需要更新用户界面
      void showDeleteUserError() {
          alert("Delete User Fail");
      }
    
      // 当用户点击某个按钮时,将用户操作路由给presenter,由presenter去处理
      void onDeleteButtonClicked(event) {
          presenter.deleteUser(event);
      }
    
    }

    Model:

    interface IUserModel {
    
      List<User> getUsers();
      boolean deleteUserById();
    
    }
    
    class UserModel implements IUserModel {
    
      // 在数据库里查找数据,并将数据返回给presenter
      List<User> getUsers() {
           return getUsersInDatabase(id);
      }
    
      // 在数据库里删除数据,并将结果返回给presenter
      User deleteUserById(id) {
          return deleteUserByIdInDatabase(id);
      }
    
    }

    Presenter

    interface IUserUserPresenter {
    
      void deleteUser(event);
    
    }
    
    class UserUserPresenter implements IUserPresenter {
    
      // 保持对View的引用
      IUserView view;
      // 保持对Model的引用
      IUserModel model;
    
      UserUserPresenter(IUserView view, IUserModel model) {
        this.view = view;    
        this.model = model;
    
        this.view.setPresenter(this);   
      }
    
      void start() {
        // 从Model中取出数据
        List<User> users = model.getUsers();
        // 将数据发送给View,让其展示到用户界面
        view.showUsers(users);
      }
    
      void deleteUser(event) {
        // View将用户操作路由过来,由Presenter来处理
        long uid = whichUserNeedToDeleteBy(event);
        // 将用户操作翻译成命令或消息传递给model,以改变数据
        boolean success = model.deleteUserById(uid);
        // 将Model操作数据后的结果通知View来改变用户界面
        if (success) {
              view.onDeleteUserSuccess();
        } else {
            view.onDeleteUserFail();  
        }
      }
    }
    

    1.3 简单的代码 

    MODE

    package s.com.mvp;
    
    public interface IBaseModel{
        String getData();
    }
    
    
    public class BaseModel implements IBaseModel{
        String textData = "这是测试数据";
        @Override
        public String getData() {
            return textData;
        }
    }

    VIEW

    package s.com.mvp;
    
    public interface IBaseView {
        //初始化Presenter
        void initPresenter(BasePresenter presenter);
        //显示数据
        void showMsg(String s);
    
        void showTest();
    }
    
    public class MainActivity extends AppCompatActivity implements IBaseView{
        private String TAG = "MainActivity";
        BasePresenter presenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initPresenter(new BasePresenter(this));
            presenter.start();
        }
    
        @Override
        public void initPresenter(BasePresenter presenter) {
            this.presenter = presenter;
        }
    
        @Override
        public void showMsg(String s) {
            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void showTest() {
            Toast.makeText(MainActivity.this, "成功!!!!!", Toast.LENGTH_SHORT).show();
        }
    }

    Presenter:

    package s.com.mvp;
    
    public interface IBasePresenter {
        //NONE
    }
    
    public class BasePresenter implements IBasePresenter{
        private String TAG = "BasePresenter";
        IBaseModel mModel;
        IBaseView mView;
    
        public BasePresenter(IBaseView mView){
            this.mView = mView;
            mModel = new BaseModel();
            this.mView.showTest();
        }
    
        public void start(){
            String s = mModel.getData();
    
            mView.showMsg(s);
        }
    }

    实现MVP的三个接口
    IBuyBookModel
    IBuyBookPresenter
    IBuyBookView

    实现MVP的两个抽象类(也就是具有共性,不需要修改的抽象类)
    BaseActivity
    BasePresenter

    上面的接口和抽象类的具体实现类
    BuyBookActivity
    BuyBookModel
    BuyBookPresenter

    2. 在webcan中的分析

    参考资料:http://blog.csdn.net/qq_31852701/article/details/52946127

  • 相关阅读:
    JAVA动态添加枚举值
    maven仓库配置
    AWS S3 上传下载文件
    golang http client的MaxConnsPerHost限制
    redis cli的特殊用法
    go调度: 第三部分-并发
    tcmalloc的memory heap profiler
    【流数据处理】MySql/PG/Oracle+Kafka+Flink(CDC捕获) 部署及实时计算
    【概念】详解MapReduce原理
    一次失败的创业经历
  • 原文地址:https://www.cnblogs.com/maogefff/p/7890401.html
Copyright © 2011-2022 走看看