这个时候其实你可以想想,写UI和逻辑的人可以完全分工,他们通过接口对接。Presenter的角色更像是一个设计模式的适配器类,负责对接UI与数据逻辑。所以不妨先看下Presenter的实现:
  public class Presenter {
  private IInfoModel infoModel;
  private IInfoView infoView;
  public Presenter(IInfoView infoView) {
  this.infoView = infoView;
  infoModel = new InfoModelImpl();
  }
  //供UI调运
  public void saveInfo(InfoBean bean) {
  infoModel.setInfo(bean);
  }
  //供UI调运
  public void getInfo() {
  //通过调用IInfoView的方法来更新显示,设计模式运用
  //类似回调监听处理
  infoView.setInfo(infoModel.getInfo());
  }
  }
  这时候回过头看下View层代码,View层同样实现了View层提供的抽象接口(也是Activity类,充当UI View)。
  如下展示了View层的实现代码:
  public class MainActivity extends ActionBarActivity implements IInfoView, View.OnClickListener{
  private EditText inputId, inputName, inputAddr;
  private Button saveBtn, loadBtn;
  private TextView infoTxt;
  private Presenter presenter;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initData();
  }
  private void initData() {
  presenter = new Presenter(this);
  inputId = (EditText) findViewById(R.id.id_input);
  inputName = (EditText) findViewById(R.id.name_input);
  inputAddr = (EditText) findViewById(R.id.addr_input);
  saveBtn = (Button) findViewById(R.id.input_confirm);
  loadBtn = (Button) findViewById(R.id.get_confirm);
  infoTxt = (TextView) findViewById(R.id.show);
  saveBtn.setOnClickListener(this);
  loadBtn.setOnClickListener(this);
  }
  @Override
  public void setInfo(InfoBean info) {
  StringBuilder builder = new StringBuilder("");
  builder.append(info.getId());
  builder.append(" ");
  builder.append(info.getName());
  builder.append(" ");
  builder.append(info.getAddress());
  infoTxt.setText(builder.toString());
  }
  @Override
  public InfoBean getInfo() {
  InfoBean info = new InfoBean();
  info.setId(Integer.parseInt(inputId.getText().toString()));
  info.setName(inputName.getText().toString());
  info.setAddress(inputAddr.getText().toString());
  return info;
  }
  @Override
  public void onClick(View v) {
  switch (v.getId()) {
  case R.id.input_confirm:
  presenter.saveInfo(getInfo());
  break;
  case R.id.get_confirm:
  presenter.getInfo();
  break;
  }
  }
  }
  到此解耦并行开发的App编码工作已经完成,如下展示运行结果:

  完整工程代码点我进入下载页面
  总结
  通过上面的例子可以发现,View(Activity)只负责处理用户交互,并把数据相关的逻辑操作都交给了Presenter去做,而Presenter调用Model处理完数据之后,再通过View的抽象接口更新View显示的信息。这样实现了完整的解耦UI与逻辑操作。
  不过,这种观点也是站在App局部代码的角度来分析看待的,对于小型App完全没这个必要,大型的App和交互复杂的可以考虑这么处理,既可以解耦,还可以方便编写test测试代码。