初识MVP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq952290156/article/details/52767546

注:此blog只为学习笔记而写,如有错误请多多指教,不喜请轻喷!


MVP模式图:

MVP的三层交互:Model主要负责数的存取, View主要负责与用户交互, Presenter充当Model和View之间的桥梁



MVP主要目的是降低耦合度,实现了Model和View的分离,从而达到修改View而不影响Model的目的。

(1) View :负责绘制UI元素、与用户进行交互(在Android中体现为Activity);

(2) View interface :需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;

(3) Model :负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);

(4) Presenter :作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

MVC模式、MVP模式和MVVM模式都作为用来分离UI层与业务层的一种开发模式。这些模式之间的差异可以归纳为对这个问题处理的方式的不同。


以下是一个迷你的mvp模式Demo

需求:存储用户和金钱,根据名字取金钱

整体Project结构


先创建一个UserBean.java:

public class UserBean {
    private String name;
    private int money;

    public UserBean(String name, int money) {
        this.name = name;
        this.money = money;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
创建IUserModel,给UserModel实现接口供Precenter向UserModel 存、取数据

IUserModel.java:

public interface IUserModel {

    // 存储数据
    void setName(String name);
    void setMoney(int money);

    // 获取数据
    UserBean load(String name);
}
UserModel .java(UserModel实现IUserModel接口):

public class UserModel implements IUserModel {


    private String mName;
    private int mMoney;
    private Map<String, UserBean> mUsers = new HashMap<>();

    @Override
    public void setName(String name) {
        mName = name;
    }

    /**
     * 保存数据  数据由 Precenter 设置过来
     * @param money
     */
    @Override
    public void setMoney(int money) {
        mMoney = money;
        UserBean userBean = new UserBean(mName, mMoney);
        mUsers.put(mName, userBean);
    }

    /**
     * 给 Precenter 提供数据
     * @param name
     * @return 根据名字 返回 bean
     */
    @Override
    public UserBean load(String name) {
        return mUsers.get(name);
    }
}
创建IUserView.java: 供UserViewActivity实现 & 给Precenter 进行交互

public interface IUserView {

    String getName();

    int getMoney();

    void setName(String name);

    void setMoney(int money);
}
创建Precenter.java  负责担任Model和View间的桥梁,进行数据的交互
/**
 * Created by Sen on 2016/10/9.
 *
 * 在 view 层拿到数据
 * 向MOdel存/取数据
 */

public class UserPrecenter {

    private final IUserModel mUserModel;
    private final IUserView mUserView;

    public UserPrecenter(IUserView view) {
        mUserView = view;
        mUserModel = new UserModel();
    }

    /**
     * 给Activity 保存数据
     * @param name
     * @param money
     */
    public void saveInfo(String name, int money) {
        mUserModel.setName(name);
        mUserModel.setMoney(money);
    }

    /**
     * 给 Activity 获取数据
     * @param name
     */
    public void loadInfo(String name) {
        UserBean user = mUserModel.load(name);
        mUserView.setName(user.getName());
        mUserView.setMoney(user.getMoney());
    }
}
UserViewActivity.java:

/**
 * 需求  根据姓名 存钱 和 取钱
 */
public class UserViewActivity extends AppCompatActivity implements IUserView {

    @Bind(R.id.edt_name)
    EditText mEdtName;
    @Bind(R.id.edt_money)
    EditText mEdtMoney;
    @Bind(R.id.safe)
    Button mSafe;
    @Bind(R.id.load)
    Button mLoad;

    private UserPrecenter mUserPrecenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_view);
        ButterKnife.bind(this);
        mUserPrecenter = new UserPrecenter(this);
    }

    @OnClick({R.id.safe, R.id.load})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.safe: // 存储数据
                mUserPrecenter.saveInfo(getName(), getMoney());
                break;
            case R.id.load: // 获取数据
                mUserPrecenter.loadInfo(getName());
                break;
        }
    }

    @Override
    public String getName() {
        return mEdtName.getText().toString();
    }

    @Override
    public int getMoney() {
        return Integer.parseInt(mEdtMoney.getText().toString());
    }

    @Override
    public void setName(String name) {
        // 拿到数据  进行数据的处理逻辑
        Log.d("it", "name:" + name);
    }

    @Override
    public void setMoney(int money) {
        // 拿到数据  进行数据的处理逻辑
        Log.d("it", "money:" + money);
    }
}
这样子代码就完成了

界面:







猜你喜欢

转载自blog.csdn.net/qq952290156/article/details/52767546
MVP