欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVP架构学习笔记

程序员文章站 2024-03-15 18:19:42
...

MVP与MVC

1 MVC

MVC各部分通信模型如下所示:
MVP架构学习笔记
MVC全名为Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。

Model:模型层,负责处理数据的加载或存储。数据更新后,通知View去更新界面显示。
View:视图层,负责界面数据的展示,与用户进行交互。接受用户的请求,然后将请求传递给Controller。
Controller:控制器层,负责逻辑业务的处理。进行业务逻辑处理后,通知Model去更新。

ListView使用中的MVC架构模型

public class ArrayAdapterActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_arrayadapter);
        //界面中的ListView是View,View在layout目录下通过xml文件格式生成,用findViewById()获取
        ListView listView = (ListView) findViewById(R.id.listview);
        // 控制数据怎样在ListView中显示是Controller
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData());
        //View和Model是通过桥梁Adapter来连接起来。
        listView.setAdapter(adapter);
        // 点击事件,Controller负责
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // position是从0开始的,获取点击item的内容
                Toast.makeText(ArrayAdapterActivity2.this, getData().get(position), Toast.LENGTH_SHORT).show();
            }
        });
    }
    // 要显示的数据Model,Model在values目录下通过xml文件格式生成
    private List<String> getData() {
        List<String> data = new ArrayList<String>();
        Resources res =getResources();
        // 取xml文件格式的字符数组
        String[] good=res.getStringArray(R.array.good);
        for(int i=0;i<good.length;i++){
            data.add(good[i]);
        }
        return data;
    }

2 面向接口编程

在继续学习MVP架构模型之前,先总结一下面向接口编程。下面举一个生活化的例子:
面向对象与面向接口
教儿童背古诗,儿童类和老师类如下:

class Child{//儿童
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Teacher{//老师
    public void teach(Child child){}//教课
}

这是典型的面向对象编程,描述了对象之间的关联,而当老师要教不同种类的人,比如,儿童、学生、外国人的时候,就变成了以下这样:

class Child{//儿童
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Student{//学生
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Teacher{//老师
    public void teach(Child child){}//教儿童背古诗
    public void teach(Student student){}//教学生背古诗
}

此时可以抽象出一个名为人的抽象类:

abstract class Person{//人
    public abstract void listen();//听课
    public abstract void recite();//朗读
}
class Child extends Person{//儿童
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Student extends Person{//学生
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Foreigner extends Person{//外国人
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Teacher{//老师
    public void teach(Person person){}//教人背古诗
}

但如果要像非人类服务对象扩展服务,具有相似的操作,此时就抽象出了一个接口,让听和读操作达到了最大的兼容性或扩展性。

public interface ListenAndReciteAble{//能听会读的
    void listen();//听课
    void recite();//朗读
}
abstract class Person implements ListenAndReciteAble{//人
}
class Child extends Person{//儿童
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Student extends Person{//学生
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Foreigner extends Person{//外国人
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Parrot implements ListenAndReciteAble{//鹦鹉
    public void listen(){}//听课
    public void recite(){}//朗读
}
class Teacher{//老师
    public void teach(ListenAndReciteAble lar){}//教背古诗
}

3 MVP

MVP为Model-View-Presenter的缩写,我的理解是将Model层和View层完全解耦。MVP架构学习笔记

  • Model:负责处理应用的数据部分
  • View:负责将带有数据的视图显示在屏幕上。
  • Presenter:连接 Model 和 View 的桥梁,它也负责操控 View。

MVP 为上述组件规定了一些基础规则,如下所示:

  • View 的唯一职责就是根据 Presenter 的指示绘制 UI。它在这个程序里应该是“哑”的。
  • View 将所有的用户交互委派给它的 Presenter。
  • View 永远不与 Model 直接交互。
  • Presenter 负责接受 View 对 Model 的请求,并且在特定的情况下控制 View。
  • Model 负责从服务器、数据库和文件系统获取数据。

下面通过一个demo作为例子,学习MVP架构的使用
首先是定义MVP所有接口:

public interface TestContract {

    interface View {
        //显示数据
        void showData(String str);
    }

    interface Presenter {
        //通知model要获取数据并把model返回的数据交给view层
        void getData();
    }

    interface Model {
        String doData();
    }
}

实现p接口:

public class TestPrePresenter implements TestContract.Presenter {

    private TestContract.Model model;
    private TestContract.View view;

    public TestPrePresenter(TestContract.Model model, TestContract.View view) {
        this.model = model;
        this.view = view;
    }

    @Override
    public void getData() {
        view.showData(model.doData());
    }
}

实现m接口:

public class TestModel implements TestContract.Model {

    private static TestModel sModel;

    public static TestModel getInstance() {
        if (sModel == null) {
            sModel = new TestModel();
        }
        return sModel;
    }

    @Override
    public String doData() {
        return "MVP架构";
    }
}
public class TestActivity extends Activity implements TestContract.View, View.OnClickListener {

    private TestContract.Presenter presenter = new TestPresenter(TestModel.getInstance(), this);

...

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tvtest:
                presenter.getData();
                break;
        }
    }

    @Override
    public void showData(String str) {
        textView.setTest(str);
    }
}