MVP設計模式應該這樣掌握

wizardev發表於2017-11-06

前言:在學習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設計模式的結構圖

圖示MVP設計模式

通過這幅圖和我們自己寫的程式碼,我們會發現Presenter層是Mode層和View層通訊的橋樑,同時也將View層和Mode層隔離開來,使它們不能直接的進行通訊,同過這種方法達到了解耦合的目的。

  通過編寫程式碼,會發現AddStudentPresenter同時持有Mode層和View層的引用,這樣就能在需要資料改變或檢視顯示時直接改變資料或者檢視的顯示狀態。同樣View層持有Presenter層的引用,這樣就能將一些處理事件的邏輯放在Presenter層中進行處理,處理完成後通知View層改變顯示狀態。

  Mode層呢,Mode層不止是實體類還有資料的增刪改查,Mode層只做與資料相關的操作。

  雖然MVP設計模式使程式碼增加不少,包結構也變得複雜,但是他使資料和檢視高度解偶,讓程式碼變的更加清晰,更易於維護,同時也方便對各個模組進行單獨的測試。

結束語

  文章採用先動手寫程式碼後理論的模式,是為了能讓大家更好的理解MVP設計模式,可以直接在專案中進行使用,縮短掌握MVP設計模式所需的時間。文章中的程式碼在這裡

轉載請註明出處:www.wizardev.com

歡迎關注我的公眾號
歡迎關注我的公眾號

相關文章