MVP设计模式应该这样掌握

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

注: 阅读本文必定要本身动手写代码!本身敲一遍代码感觉一下MVP设计模式。git

MVP的简单介绍

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

MVP设计模式初体验

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

设计数据层

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

public interface StudentDataSource {
    void addStudent(Student student);
}
复制代码

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

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

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

设计视图层和主持者

  一样,先写一个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,以下ui

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设计模式的结构图

图示MVP设计模式

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

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

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

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

结束语

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

转载请注明出处:www.wizardev.com

欢迎关注个人公众号
欢迎关注个人公众号
相关文章
相关标签/搜索