估計很多朋友都會在android面試的時候拿到一張白紙,要你寫一個簡易的MVP模型出來。這里就教大家如何去速成,我們盡量將步驟控制到最小,最易懂,最好記。
-
定大小
presenter是老大,model和view是小弟,都要聽presenter的話,誰讓它站最后一排呢。
所以presenter要管著model和view。 -
先什么都不要管,把這三個家伙給揪出來
Presenter是class,兩個小弟是interface
public class Presenter {
}
public interface IModel {
}
public interface IView {
}
為什么不直接用Model就好了嘛干嘛還要前面加個`I`,其實為了做MVP的統一,Model和Presenter都沒有問題,但是View直接作為接口名,你覺得OK么?所以我這邊就冒著被誤認為在講解Binder的風險,前面加了個`I`,表示這玩意兒他咩的是接口。
* ###想像一下,你要做什么事情
你說,我想像我在面試,GUN!
我的意思是,你既然要基于android做一個超簡單的MVP模型,那你總歸要設想一個最簡單的用例。
比如我這邊就想著在屏幕上有個按鈕,然后點擊按鈕,彈出一個Toast。
考慮到我們需要強行引入model層,所以彈出的Toast內容是要User類中的name屬性。
* ###分析想像用例的場景進行事務拆解
根據上面我想像的用例(當然你可以直接使用我這個簡單的用例),
我們把對象拆解成人和activity和手機系統。
> 此處為了快速的寫mvp,會有誤導,其實真實的任務分配是展示任務分配給View,更明確的說是離不開activity的任務分配給view;數據的操作任務分配給model,這一環其實可有可無;剩余的所有業務邏輯任務統統分配presenter。為了促成mvp速成,讀者朋友可以回過頭來再細細品味。
* 人
把人需要做的事情,加入到presenter接口中。
這個用例中,人需要做的是點擊按鈕,那么我們加入一個clickButton的方法(方法的名字可以取你喜歡的,更加貼近業務場景的)
```
public class Presenter {
void clickButton(){
Log.e("xxx", "you click");
}
}
- activity
activity在MVP中是充當V的,也就是View層。我們所有的View的初始化全都在activity中進行。因此我們把界面展示所需要做的事情都加入到view接口中。
這個用例中,view需要做的是,當點擊了button之后,會彈出一個Toast,因此我們給出接口方法showToast。
public interface IView {
//既然是交給activity來實現彈出toast,那我們肯定要返回toast具體彈出什么內容
void showToast(String content);
}
* 手機系統
除了人和activity之外,其他的就是手機系統需要去干的事情。
那還剩下的制造toast內容就是由手機系統去做的
public interface IModel {
//既然交給系統來處理需要toast什么內容,那我們處理完肯定需要把這個內容返回出來
String makeToastContent();
}
* ###關聯MVP
由于presenter需要管著兩個小弟,所以它必須要要有兩個小弟的實例,所以自然而然的想到通過構造方法傳遞。
public class Presenter {
IView iView;
IModel iModel;
void clickButton(){
Log.e("xxx", "you click");
}
public Presenter(IView view, IModel model) {
iView = view;
iModel = model;
}
}
* ###接口實現
兩個接口,我們依次實現
public class ToastContentMaker implements IModel {
@Override
public String makeToastContent() {
return "you did click!";
}
}
public class MvpActivity extends AppCompatActivity implements IView {
@Override
public void showToast(String content) {
Toast.makeText(this, content, Toast.LENGTH_LONG).show();
}
}
* ###添加presenter邏輯
將presenter的邏輯添加到activity中
Presenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new Presenter(this, new ToastContentMaker());
findViewById(R.id.bt_hello).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.clickButton();
}
});
}
* ###最后我們去改一下presenter的clickButton方法
void clickButton(){
Log.e("xxx", "you click");
iView.showToast(iModel.makeToastContent());
}
---------
* ### 總結如下流程
* 一個P類,兩個接口(```定接口```)
* 提取view的方法放view接口,數據操作的方法放model接口,其他方法都空實現在P類(```分方法```)
* Activity實現view接口(```做實現```)
* 自定義數據操作類實現model接口
* P類內部持有兩個接口實例。
* Activity初始化P類,并使用P類方法代替業務邏輯(```補方法```)
* 順著業務邏輯去P類,調用V和M的接口方法執行業務操作。
-----------
[如何快速的寫一個MVVM出來](http://www.lxweimin.com/p/e4a5b8ebf8a2)