android mvp开发模式

什么是开发模式?
以一种简单明了的方式去开发程序
什么是mvp,有一个叫做mvc的不行吗
model(模型) view(视图) presenter(主持)
mvc—>>model(模型) view(视图) control(控制)
android最原始的开发(将逻辑写进activity里面),然后一个实体类(数据层)
其实这就是mvc了
但是,activity既当爹又当妈的就是说即使v层也是c层
到最后,改功能的时候,你会发现一件事,what?代码怎么这么多,如果你还记得你写的方法或者什么叫撒名,你可以用ctrl+f去查找。
所以,mvp出来了。presenter就来替activity分担
现在activity只负责视图显示了,视图想要撒,跟p说,p拿到请求后对m说:“给我xxxxx”。m就给了p xxxx。
然后p将xxxx给了v,v最后更新ui给用户显示
看图!
mvc

可以看到m甚至可以对v做出操作然后

mvp
相互之间独立,对开发解耦,也为后期维护保证了便利性
不多说了看看代码

1. 结构

结构
分别的文件夹对应相应的层,同时,我们某一层对另一层的请求,一般为接口,对接口方法的复写

2. layout布局

这里简单点,就一个button请求对textview进行替换

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="mvp demo"
        android:textSize="18sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="替换" />
</LinearLayout>

只有一个布局,别想多了

3. 接着逻辑

button请求,textview替换,那么接口就这样
IModel.java

public interface IModel {
    void change(OnFinishListener listener);
}

Model.java实现

public class Model implements IModel {
    @Override
    public void change(OnFinishListener listener) {
        listener.successful("替换成功");
    }
}

就是得到请求后返回数据,这里有一个listener,这是什么?这一般拿来给model返回数据用,不可能将void改成String或者其他的来直接返回给presenter吧,那presenter会乱糟透的,当然你可以试试
接着看看listener的代码

public interface OnFinishListener {
    void successful(String text);
    void failed(String error);
}

ok,listener既然是个接口给谁用呢,谁调用m层呢?没错presenter
IPresenter.java

public interface IPresenter {
    void change();
}

Presenter.java

public class Presenter implements IPresenter,OnFinishListener {

    @Override
    public void change() {

    }

    @Override
    public void successful(String text) {

    }

    @Override
    public void failed(String error) {

    }
}

首先先实现两个接口的方法,接着完善,既然v层,请求p层,那么change()就是方法了,但是谁给的presenter呢?就要在构造方法里告诉了

public class Presenter implements IPresenter,OnFinishListener {

    private IModel mIModel;
    private IView mIView;

    public Presenter(IView IView) {
        mIView = IView;
        mIModel = new Model();
    }

    @Override
    public void change() {
        mIModel.change(this);
    }

    @Override
    public void successful(String text) {
        mIView.setTv(text);
    }

    …………………
}

ok,p层也完了,接下来,v层。
这里我们想一下,v要干嘛?
不错,显示textview,那么我们把显示tv的操作拿出来,放进接口里(IView.java)

public interface IView {
    void setTv(String tv);
}

emmmmmm,看看有疏漏的么
set传入参数,设置参数值,恩没错、
看实现类

public class MVPAvtivity extends AppCompatActivity implements IView {

    private TextView mTextView;
    private IPresenter mIPresenter;//接口变量,建议不要用Presenter
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvp);
        mIPresenter = new Presenter(this);//presenter实例化
        mTextView = findViewById(R.id.tv);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mIPresenter.change();//调用变量的方法,总会有某个人去实现它
            }
        });
    }

    @Override
    public void setTv(String tv) {
        mTextView.setText(tv);//设置tv
    }
}

相信自己,能读懂它
我相信这样一件事,在以后你会发现,每次改动功能,那么p层也会相应的改动,十之八九你会直接改动Presenter.java,只需要限定符为public就万事大吉,并且P层的接口类都可以不用了。
但是,当你这么做的时候,你每次在某个地方调用P层的方法时,你可能会这样:

  • presenter. 然后在idea弹出的方法里去找(p层是自己写的话可能也一样)
  • 在java文件里一行一行的读,找到自己的方法
  • My god listener的方法怎么都在,撞邪了?没有,方法就是public

既然这样你为撒不写在接口里面方便又快捷,一行一个方法,看着都舒服

4. 都操作完了,我们来运行一下

emmmm gradle.build…………
这里写图片描述
这里写图片描述

如有什么疑问,请提出
如有什么不足,请指出
谢谢!

最后安利一个mvp高级封装

http://blog.csdn.net/yulong0809/article/details/78622428?ref=myread

猜你喜欢

转载自blog.csdn.net/qq_34206863/article/details/78822117