估计很多朋友都会在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.jianshu.com/p/e4a5b8ebf8a2)