前言:在學習MVP設計模式時,咱們所讀的大部分文章都是首先介紹什麼是MVP以及MVP與MVC設計模式的不一樣,這些文章都講的很好,可是這些理論的東西不但容易忘記,並且對於那些都沒有接觸過MVC設計模式的人來講可能還有點難以理解。這篇文章理論知識不多,重點是讓你能將MVP設計模式用到本身的開發中。java
注: 閱讀本文必定要本身動手寫代碼!本身敲一遍代碼感覺一下MVP設計模式。git
仍是要講點理論!MVP分別是Mode、View和Presenter,翻譯過來就是數據、視圖和主持者,行!就先知道這麼多,下面動手寫代碼。github
這裏用一個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設計模式的結構圖
經過這幅圖和咱們本身寫的代碼,咱們會發現Presenter層是Mode層和View層通信的橋樑,同時也將View層和Mode層隔離開來,使它們不能直接的進行通信,同過這種方法達到了解耦合的目的。
經過編寫代碼,會發現AddStudentPresenter同時持有Mode層和View層的引用,這樣就能在須要數據改變或視圖顯示時直接改變數據或者視圖的顯示狀態。一樣View層持有Presenter層的引用,這樣就能將一些處理事件的邏輯放在Presenter層中進行處理,處理完成後通知View層改變顯示狀態。
Mode層呢,Mode層不止是實體類還有數據的增刪改查,Mode層只作與數據相關的操做。
雖然MVP設計模式使代碼增長很多,包結構也變得複雜,可是他使數據和視圖高度解偶,讓代碼變的更加清晰,更易於維護,同時也方便對各個模塊進行單獨的測試。
文章採用先動手寫代碼後理論的模式,是爲了能讓你們更好的理解MVP設計模式,能夠直接在項目中進行使用,縮短掌握MVP設計模式所需的時間。文章中的代碼在這裏
轉載請註明出處:www.wizardev.com