mvp模式初探

mvp模式初探

前言
mvp应用逐渐广泛,学习mvp模式,将给你的编码带来很大的优势。
什么是mvp
mvp,全称model view presenter,是mvc的升级版。我们都知道mvc表现层与业务层分离,耦合度不高。实际上,我们也知道,mvc(model view controler)中,view 和controler基本上是由activity承载,这就造成一个activity可能很庞大,不便于后期维护和升级。
mvp即是通过presenter接口将view与model解耦,各模块可独立变化, 有效降低耦合度。
mvp思想
mvp将activity中的UI逻辑抽象成view接口,把业务逻辑抽象成presenter接口,model还是原来的model。
mvp模式中,acitvity用来显示view和管理acitivity生命周期,逻辑交由presenter实现。
mvp模式UML图
mvp模式uml图
使用mvp模式流程

  • 首先创建一个Presenter接口,并创建的它的实现类PresenterImpl,用以实现所有的逻辑;
  • 创建一个IView接口用于实现view(视图)逻辑,它的实现类是activity或fragment;
  • 在Activity中包含一个Presenter的引用,PresenterImpl中又包含一个IView的引用和model的依赖;
    这样Activity的业务就可以交给Presenter来实现了。

mvp的简单例子
为方便说明mvp在实际开发中的应用,这里举个简单的例子,方便理解。
代码结构
这里写图片描述
首先看LoginActivity代码:

public class LoginActivity extends AppCompatActivity  implements ILoginView, View.OnClickListener {

    private Button btn_login;
    private Button btn_clear;
    private EditText et_name;
    private EditText et_pwd;

    private ILoginPresenter iLoginPresenter;

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

        btn_clear= (Button) findViewById(R.id.btn_clear);
        btn_login= (Button) findViewById(R.id.btn_login);
        et_name= (EditText) findViewById(R.id.et_name);
        et_pwd= (EditText) findViewById(R.id.et_password);

        btn_clear.setOnClickListener(this);
        btn_login.setOnClickListener(this);

        iLoginPresenter=new LoginPresenterCompl(this);

    }

    @Override
    public void onClearText() {
        et_pwd.setText("");
        et_name.setText("");
    }

    @Override
    public void onLoginResult(Boolean Result, int code) {
        if(Result){
            Toast.makeText(this,"登录成功!",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this,"登录失败,请检查用户名和密码。",Toast.LENGTH_SHORT).show();

        }
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.btn_clear:
                iLoginPresenter.clear();
                break;
            case R.id.btn_login:
                String name=et_name.getText().toString().trim();
                String pwd=et_pwd.getText().toString().trim();
                if(name.equals("")||pwd.equals("")){
                    Toast.makeText(this,"用户名和密码不能为空!",Toast.LENGTH_SHORT).show();
                }
                iLoginPresenter.doLogin(name,pwd);
                break;
        }
    }
}

接着看Presenter,代码如下:


public interface ILoginPresenter {
   public void doLogin(String name,String pwd);
   public void clear();
}

跟着是ILoginView,代码如下:

public interface ILoginView {
    public void onClearText();
    public void onLoginResult(Boolean Result,int code);
}

Presenter的具体实现类,代码如下:

public class LoginPresenterImpl implements ILoginPresenter {
    private ILoginView iLoginView;
    private User user;

    public LoginPresenterImpl(ILoginView iLoginView){
        this.iLoginView=iLoginView;
        user=new User("zhangshan","123456");
    }

    @Override
    public void clear() {
        iLoginView.onClearText();
    }

    @Override
    public void doLogin(String name, String pwd) {
        if (name.equals(user.getName())&&pwd.equals(user.getPwd())){

            iLoginView.onLoginResult(true,200);
        }else{
            iLoginView.onLoginResult(false,202);
        }
    }
}

最后是model:

public class User {
    private String name;
    private String pwd;

    public User(String name,String pwd){
        this.name=name;
        this.pwd=pwd;
    }
    public String getName() {
        return name;
    }

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

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

这是一个很简单的demo。
最后再总结一下mvp带来的优势:
解耦,为activity瘦身,方便扩展维护。
这只是个起点,后续会进一步学习总结mvp相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值