MVP模式学习

最近一段时间在学习H5开发,没有研究android,今天学习了一下MVP设计模式,记录一下。

主要参考了一下文章:贴出链接,以示敬意。

http://blog.csdn.net/knxw0001/article/details/39637273

以及

http://blog.csdn.net/duo2005duo/article/details/50594757

再次表示感谢。

界面完全借鉴,就是简单的三个EditText和两个按钮,这些不是关键,关键在于怎么符合MVP模式。

个人认为最重要的一点就是Model层与View层完全分割开,跟中介类似。举个例子来说,甲有个app项目找到中介乙,报价2万,工期10天,中介乙就找到丙,报价1万6,工期十天。十天后,丙完美完成,把app交给中介乙,拿走1万6。中介乙把app交给甲,拿到2万。在这个过程中,甲和丙没有见过面,完全由乙这个中间商进行各种需求的指定和传递。甲就是View层,丙就是Model层。乙就是P层。


开始贴代码:

首先是MainActivty界面。主要需求是点击保存按钮后,保存一个用户信息。实现接口IView中的setSuccessData(String result)和setFailData(String result)方法。setSuccessData(String result)方法用来处理用户信息保存成功后的各种操作;而setFailData(String result)则用来处理用户信息保存失败的各种操作。

在这个过程中,MainActivity在presenter.save(idString,firstName,secondName)后,不再关心任何其他事情,只需要去处理保存成功或者保存失败就可以了。也就是说公司甲把项目交给乙之后,不管乙是如何实现的,只需要考虑十天后能不能从乙那里拿到app就可以了。(拿到完工的产品,则...;拿不到则...)

public class MainActivity extends AppCompatActivity implements View.OnClickListener,IView{
    EditText id, first, second;
    Button save, read;

    private UserPresenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        id = (EditText) findViewById(R.id.et_id);
        first = (EditText) findViewById(R.id.et_first);
        second = (EditText) findViewById(R.id.et_second);

        save = (Button) findViewById(R.id.bt_save);
        read = (Button) findViewById(R.id.bt_read);
        save.setOnClickListener(this);
        read.setOnClickListener(this);
        presenter = new UserPresenter(this);
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.bt_save://点击保存
                //获取名称
                String firstName = first.getText().toString().trim();
                String secondName = second.getText().toString().trim();
                String idString = id.getText().toString().trim();
                //找到presenter,交给presenter
                presenter.save(idString,firstName,secondName);
                //还需要返回保存的结果
                break;
            case R.id.bt_read://点击读取
                break;
        }
    }
    @Override
    public void setSuccessData(String result) {
        Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();//弹出吐司,提示保存成功,实际项目时替换成其他操作。
    }
    @Override
    public void setFailData(String result) {
        Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();//弹出吐司,提示保存失败
    }
}

然后我们来看一下IView这个接口。

public interface IView {
    void setSuccessData(String result);
    void setFailData(String result);
}
就这简单的几行代码,仅仅声明成功与失败的方法。当然,实际项目中肯定不止这样,要根据具体需求定。MainActivity(View层)的代码到此结束。我们来看Model层。

Model层只负责业务逻辑的处理,首先定义一个接口IUserModel

public interface IUserModel {

    void getData(ISaveSuccessCallBack callBack);

    interface ISaveSuccessCallBack {
        void OnResult(String result);
    }

    void getData(ISaveFailCallBack callBack);

    interface ISaveFailCallBack {
        void OnResult(String result);
    }

    int save(String id, String firstName, String secondName);
}
然后UserModel实现IUserModel

public class UserModel implements IUserModel {

    @Override
    public void getData(ISaveSuccessCallBack callBack) {
        callBack.OnResult("Success1");
    }

    @Override
    public void getData(ISaveFailCallBack callBack) {
        callBack.OnResult("Fail1");
    }

    @Override
    public int save(String id, String firstName, String secondName) {

        UserBean user = new UserBean(id,firstName,secondName);//这里进行各种业务逻辑处理

        if(id.equals("0")){
            return 0;
        }
        return 1;
    }
}
我们来仔细看一下UserModel。它只有三个函数,先来看sava方法,它是用来保存用户信息,可以根据需要进行各种业务逻辑处理。然后id值主要是模拟业务逻辑处理成功和失败的效果。另外两个getData分别用来在业务处理成功与失败后设置返回的数据。也就是说丙也有两种可能,第一种十天完美完成,他就给乙返回success(return 1),没有完成就返回fail.(return 0)

最后来看Presenter

public class UserPresenter {

    private IUserModel userModel;
    private IView view;

    public UserPresenter(IView view) {
        userModel = new UserModel();
        this.view = view;
    }

    public void save(String id, String firstName, String secondName) {
        //交给IModel
        int a = userModel.save(id, firstName, secondName);
        if (a == 1) {//a==1,成功
            userModel.getData(new IUserModel.ISaveSuccessCallBack() {
                @Override
                public void OnResult(String result) {
                     view.setSuccessData(result + "哈哈哈");
                }
            });
        } else {
            userModel.getData(new IUserModel.ISaveFailCallBack() {
                @Override
                public void OnResult(String result) {
                    view.setFailData(result + "呜呜呜");
                }
            });
        }
    }
}

Iview view是在MainActivity中初始化时传递过来的对象,相当于甲。

IUserModel userModel 就相当于丙。

由于从MainActivity中有一个presenter.save(id,firstName,secondName);所以它需要实现这个方法

我们来仔细看一下这个方法。首先第一句:

int a = userModel.save(id, firstName, secondName);
这一句把V层(MainActivity)传递过来要处理的数据直接传递给UserModel,不进行任何处理,也就是甲把开发需求给了中介乙,乙转身直接给了丙。在这个过程中,乙可能完全不会app开发,它只进行管理。返回的a的值就是十天后丙告诉中介乙的信息,乙根据a的值进行判断。如果a=1,中介乙就知道丙完成了,然后就调用丙成功的回调(IsuccessCallback)得到成功的产品,我在这里就用字符串success或者fail代替。而如果a=0了,那么就调用丙失败的回调(IFailCallback)得到一封道歉信或者其他的东西。当然,在通过回调得到信息后,也可以在这里进行处理(当然那也可以不处理),这要看具体需求而定。

注意:在这里,UserModel中的成功与失败我都写成了两个接口来实现,也可以把成功与失败写成一个接口的形式


最后是UserBean忘记贴了:

public class UserBean {

    private String id;
    private String firstName;
    private String secondName;

    public UserBean(String id,String firstName, String secondName) {
        this.firstName = firstName;
        this.id = id;
        this.secondName = secondName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSecondName() {
        return secondName;
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

(说一点题外话,最近学习H5开发用到了Vue.js,是一个js的MVVM框架,用起来十分好用,用起来特别简单,不是广告,真心推荐。而android的MVVM本人没有做好学习的准备,如果有比较好的MVVM的帖子,还请推荐,谢谢,谢谢,谢谢)


最后附上源码地址:


http://download.csdn.net/detail/u013034413/9490147


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值