MVP设计模式应该这样掌握

简介: MVP设计模式应该这样掌握

前言:在学习MVP设计模式时,我们所读的大部分文章都是首先介绍什么是MVP以及MVP与MVC设计模式的不同,这些文章都讲的很好,但是这些理论的东西不但容易忘记,而且对于那些都没有接触过MVC设计模式的人来说可能还有点难以理解。这篇文章理论知识很少,重点是让你能将MVP设计模式用到自己的开发中。

注: 阅读本文一定要自己动手写代码!自己敲一遍代码感受一下MVP设计模式。

MVP的简单介绍

  还是要讲点理论!MVP分别是ModeViewPresenter,翻译过来就是数据视图主持者,行!就先知道这么多,下面动手写代码。

MVP设计模式初体验

  这里用一个List来代表数据层,Activity就是视图层,AddPresenter来作为主持者,下面编写代码。

设计数据层

  首先定义一个名为StudentDataSource的接口,为了能更容易的理解MVP设计模式,这里就只有一个添加数据的方法,如下

public interface StudentDataSource {
    void addStudent(Student student);
}

  接着写一个名为StudentRepository的类实现StudentDataSource接口,如下

public class StudentRepository implements StudentDataSource{
    private List<Student> mStudents = new ArrayList<>();
    @Override
    public void addStudent(Student student) {
        mStudents.add(student);
    }
}

行,这样就写好了数据层即Mode,简单吧!下面就分别来实现视图层主持者

设计视图层和主持者

  同样,先写一个BasePresenter接口和BaseView接口分别作为主持者和视图层的基类,如下

public interface BasePresenter {
}
public interface BaseView<T> {
    void setPresenter(T presenter);
}

下面将视图层和主持者层都放进一个AddStudentContract契约类里,如下

public interface AddStudentContract {
    interface Presenter extends BasePresenter {
        void saveStudent();
    }
    interface View extends BaseView<Presenter> {
        void showSaveSuccess();
    }
}

这样做的好处是可以统一管理View层和Presenter层,这样就将接口设计好了,先面开始写实现类。先看Presenter层的实现类AddStudentPresenter,如下

public class AddStudentPresenter implements AddStudentContract.Presenter {
    private AddStudentContract.View mAddStudentView;
    private StudentDataSource addStudentRepository;
    public AddStudentPresenter(AddStudentContract.View view) {
        mAddStudentView = view;
        addStudentRepository = new StudentRepository();
    }
    @Override
    public void saveStudent() {
        Student student = new Student();
        student.setAge(20);
        student.setName("wizardev");
        addStudentRepository.addStudent(student);
        mAddStudentView.showSaveSuccess();
    }
}

再看View层的实现,这里View层的实现就是Activity,代码如下

public class AddStudentActivity extends AppCompatActivity implements AddStudentContract.View {
    private AddStudentContract.Presenter mPresenter;
    private Button mAddStudent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setPresenter(new AddStudentPresenter(this));
        mAddStudent = findViewById(R.id.addStudent);
        mAddStudent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.saveStudent();
            }
        });
    }
    @Override
    public void setPresenter(AddStudentContract.Presenter presenter) {
        if (presenter != null) {
            mPresenter = presenter;
        }
    }
    @Override
    public void showSaveSuccess() {
        Toast.makeText(this,"添加成功!",Toast.LENGTH_SHORT).show();
    }
}

好了,上面即使MVP的设计模式的使用,到了这里先停下来,先自己把上面的代码写一遍,体会一下,然后再继续阅读。

MVP设计模式的总结

  通过自己动手编写代码,相信你已经对MVP设计模式有了一定的了解,下面看下MVP设计模式的结构图

通过这幅图和我们自己写的代码,我们会发现Presenter层是Mode层和View层通讯的桥梁,同时也将View层和Mode层隔离开来,使它们不能直接的进行通讯,同过这种方法达到了解耦合的目的。

  通过编写代码,会发现AddStudentPresenter同时持有Mode层和View层的引用,这样就能在需要数据改变或视图显示时直接改变数据或者视图的显示状态。同样View层持有Presenter层的引用,这样就能将一些处理事件的逻辑放在Presenter层中进行处理,处理完成后通知View层改变显示状态。

  Mode层呢,Mode层不止是实体类还有数据的增删改查,Mode层只做与数据相关的操作。

  虽然MVP设计模式使代码增加不少,包结构也变得复杂,但是他使数据和视图高度解偶,让代码变的更加清晰,更易于维护,同时也方便对各个模块进行单独的测试。

结束语

  文章采用先动手写代码后理论的模式,是为了能让大家更好的理解MVP设计模式,可以直接在项目中进行使用,缩短掌握MVP设计模式所需的时间。文章中的代码在这里



相关文章
|
6月前
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
148 12
|
7月前
|
设计模式 存储 前端开发
【各种问题处理】MVC、MVP、MVVM 、MVI、VIPER 架构(设计模式)
【1月更文挑战第13天】【各种问题处理】MVC、MVP、MVVM 、MVI、VIPER 架构(设计模式)
|
存储 设计模式 前端开发
|
设计模式 XML 存储
vue相关面试题:MVC,MVP,MVVP三种设计模式的区别
patch 阶段根据 VNode 创建真实节点树,核心方法为 createElm,首先遇到组件类型的 VNode,内部会执行 $mount,再走一遍相同的流程。普通节点类型则创建一个真实节点,如果它有子节点开始递归调用 createElm,使用 insert 插入子节点,直到没有子节点就填充内容节点。最后递归完成后,同样也是使用 insert 将整个节点树插入到页面中,再将旧的根节点移除。
236 0
|
存储 数据库 Android开发
Android MVP 设计模式
1、基本概念      Model    : 模型   负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;     View     : 视图    负责界面数据的展示,与用户进行交互;     Presenter :主持人 任命者   负责协调关系,是模型与视图之间的桥梁,将模型与视图分离开来。
792 0
|
测试技术 设计模式 存储
大规模应用的开发与MVP设计模式
原文http://code.google.com/intl/zh-CN/webtoolkit/articles/mvp-architecture.html 开发任何大型应用程序都有其困难,GWT应用程序也不例外。多个开发人员同时工作在同一个代码库中,维护同一模块的功能,很有可能把代码搞乱。为了增强代码的可维护性,我们在项目引进了设计模式来分离各部分的职责。 在多种设计模式可供选择:Pres
1044 0
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。