天天看點

MVP快速開發架構

所謂MVP(Model-View-Presenter)模式。是将APP的結構分為三層:

view - UI顯示層

view 層主要負責:

  1. 提供UI互動
  2. 在presenter的控制下修改UI。
  3. 将業務事件交由presenter處理。

    注意. View層不存儲資料,不與Model層互動。

presenter - 邏輯處理層

presenter 層主要負責:

  1. 對UI的各種業務事件進行相應處理。也許是與Model層互動,也許自己進行一些計算,也許控制背景Task,Servic
  2. 對各種訂閱事件進行響應,修改UI。
  3. 臨時存儲頁面相關資料。

    注意. Presenter内不出現View引用。

model - 資料層

model層主要負責:

  1. 從網絡,資料庫,檔案,傳感器,第三方等資料源讀寫資料。
  2. 對外部的資料類型進行解析轉換為APP内部資料交由上層處理。
  3. 對資料的臨時存儲,管理,協調上層資料請求。

如圖示,裡面的activity,presenter,model均為例子:

MVP快速開發架構

mvp

将複雜的功能分割為各層内的小問題。各層内功能單一。這樣易于功能修改拓展與Debug。

解耦的設計,獨立的子產品,更有利于分工開發與測試。

簡單例子如下

UserBean.java

package com.example.mvptest.com.example.bean;

/**
 * Created by Administrator on 2016/6/2.
 */
public class UserBean {
    private String mobile;
    private String userpwd;

    public UserBean(String mobile, String userpwd) {
        this.mobile = mobile;
        this.userpwd = userpwd;
    }

    public String getMobile() {
        return mobile;
    }

    public String getUserpwd() {
        return userpwd;
    }
}      

Model層

IUserModel.java和UserModel.java

public interface IUserModel {

    void setID(int id);
    void setMobile(String mobile);
    void setUserPwd(String userpwd);
    UserBean load(int id);
}      
package com.example.mvptest.com.example.model;

import android.util.SparseArray;

import com.example.mvptest.com.example.bean.UserBean;

/**
 * Created by Administrator on 2016/6/2.
 */
public class UserModel implements IUserModel {
    private String usermobile;
    private String userPwd;
    private int mID;
    private SparseArray<UserBean> mUserArray = new SparseArray<UserBean>();

    @Override
    public void setID(int id) {
        mID = id;
    }

    @Override
    public void setMobile(String mobile) {
        usermobile = mobile;
    }

    @Override
    public void setUserPwd(String userpwd) {
        userPwd = userpwd;
        UserBean userBean = new UserBean(usermobile, userpwd);
        mUserArray.append(mID, userBean);
    }

    @Override
    public UserBean load(int id) {
        mID = id;
        UserBean userBean = mUserArray.get(mID, new UserBean("no data", "not data"));
        return userBean;
    }
}      

View層

package com.example.mvptest.com.example.view;

/**
 * Created by Administrator on 2016/6/2.
 */
public interface IUserView {
    int getID();
    String getMobile();
    String getUserPwd();
    void setMobile(String mobile);
    void setUserpwd(String userpwd);
}      

Presenter層

package com.example.mvptest.com.example.presenter;

import com.example.mvptest.com.example.bean.UserBean;
import com.example.mvptest.com.example.model.IUserModel;
import com.example.mvptest.com.example.model.UserModel;
import com.example.mvptest.com.example.view.IUserView;

/**
 * Created by Administrator on 2016/6/2.
 */
public class UserPresenter {
    private IUserView mUserView;
    private IUserModel mUserModel;

    public UserPresenter(IUserView mUserView) {
        this.mUserView = mUserView;
        this.mUserModel = new UserModel();
    }

    public void saveUser(int id, String mobile, String userpwd) {
        mUserModel.setID(id);
        mUserModel.setMobile(mobile);
        mUserModel.setUserPwd(userpwd);
    }

    public void loadUser(int id) {
        UserBean user = mUserModel.load(id);
        mUserView.setMobile("bb"+user.getMobile());
        mUserView.setUserpwd(user.getUserpwd());
    }
}      

Activity層實作IUserView接口

public class MainActivity extends AppCompatActivity implements View.OnClickListener, IUserView{
    private EditText mobileEdt, pwdEdt;
    UserPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.save).setOnClickListener(this);
        findViewById(R.id.load).setOnClickListener(this);

        mobileEdt = (EditText) findViewById(R.id.mobile);
        pwdEdt = (EditText) findViewById(R.id.passwd);

        presenter = new UserPresenter(this);
    }

    @Override
    public int getID() {
        return 3;
    }

    @Override
    public String getMobile() {
        return mobileEdt.getText().toString();
    }

    @Override
    public String getUserPwd() {
        return pwdEdt.getText().toString();
    }

    @Override
    public void setMobile(String mobile) {
        mobileEdt.setText(mobile);
    }

    @Override
    public void setUserpwd(String userpwd) {
        pwdEdt.setText(userpwd);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.save:
                presenter.saveUser(3, getMobile(), getUserPwd());
                break;
            case R.id.load:
                presenter.loadUser(3);
                break;
            default:
                break;
        }
    }
}      

複雜例子:

https://github.com/wenhuaijun/SearchPictureTool

MVP快速開發架構