如何快速的写一个MVP出来

估计很多朋友都会在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)

你可能感兴趣的:(如何快速的写一个MVP出来)