转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!
什么是MVP呢?它又和我们经常听到的MVC有什么关系了以及差别呢?
不仅如此。我们还能够编写測试用的View。模拟用户的各种操作,从而实现对Presenter的測试--而不须要使用自己主动化的測试工具。
我们甚至能够在Model和View都没有完毕时候,就能够通过编写Mock Object(即实现了Model和View的接口,但没有详细的内容的)来測试Presenter的逻辑。 在MVP里,应用程序的逻辑主要在Presenter来实现,当中的View是非常薄的一层。因此就有人提出了Presenter First的设计模式,就是依据User Story来首先设计和开发Presenter。在这个过程中。View是非常easy的,能够把信息显示清楚就能够了。在后面。依据须要再随便更改View,而对Presenter没有不论什么的影响了。 假设要实现的UI比較复杂,并且相关的显示逻辑还跟Model有关系,就能够在View和Presenter之间放置一个Adapter。
由这个 Adapter来訪问Model和View。避免两者之间的关联。而同一时候。由于Adapter实现了View的接口,从而能够保证与Presenter之间接口的不变。
这样就能够保证View和Presenter之间接口的简洁,又不失去UI的灵活性。
在MVP模式里。View仅仅应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有很多其它的内容,绝不容许直接訪问Model--这就是与MVC非常大的不同之处。
ProgressBar控件和TextView控件。我们推断它是否有网络连接,假设有的话就隐藏 ProgressBar和跳转到MainActivity假设没有网络的话则显示ProgressBar和TextView,TextView则提示用户No internet。就这么简单的一个需求,我们看看怎样用MVP模式做这个需求
首先我们看下M层是怎样接口写的
package com.manning.androidhacks.hack020.presenter.model; public interface IConnectionStatus { boolean isOnline(); }然后看看实现(我们主要是看MVP模式的使用,所以在此就不做网络连接的检查了。模拟一个状态)
package com.manning.androidhacks.hack020.presenter.model.impl; import com.manning.androidhacks.hack020.presenter.model.IConnectionStatus; public class ConnectionStatus implements IConnectionStatus { @Override public boolean isOnline() { // TODO: Here we should place the code to check the connectivity. return true; } }然后我们在来看看V的接口
package com.manning.androidhacks.hack020.view; public interface ISplashView { void showProgress(); void hideProgress(); void showNoInetErrorMsg(); void moveToMainView(); }以及V的实现
package com.manning.androidhacks.hack020.view.impl; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import com.manning.androidhacks.hack020.R; import com.manning.androidhacks.hack020.presenter.SplashPresenter; import com.manning.androidhacks.hack020.view.ISplashView; public class SplashActivity extends Activity implements ISplashView { private TextView mTextView; private ProgressBar mProgressBar; private SplashPresenter mPresenter = new SplashPresenter(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); mPresenter.setView(this); mTextView = (TextView) findViewById(R.id.splash_text); mProgressBar = (ProgressBar) findViewById(R.id.splash_progress_bar); } @Override protected void onResume() { super.onResume(); mPresenter.didFinishLoading(); } public void showProgress() { mProgressBar.setVisibility(View.VISIBLE); } public void hideProgress() { mProgressBar.setVisibility(View.INVISIBLE); } public void showNoInetErrorMsg() { mTextView.setText("No internet"); } @Override public void moveToMainView() { startActivity(new Intent(this, MainActivity.class)); } }
最后我们来看看P层是怎样控制他们的逻辑的:
public class SplashPresenter { private IConnectionStatus mConnectionStatus; private ISplashView mView; public SplashPresenter() { this(new ConnectionStatus()); } public SplashPresenter(IConnectionStatus connectionStatus) { mConnectionStatus = connectionStatus; } public void setView(ISplashView view) { this.mView = view; } protected ISplashView getView() { return mView; } public void didFinishLoading() { ISplashView view = getView(); if (mConnectionStatus.isOnline()) { view.showProgress(); view.moveToMainView(); } else { view.hideProgress(); view.showNoInetErrorMsg(); } } }
好,我个人理解,就是把逻辑层抽出来成P层,要是遇到需求逻辑上的更改就能够仅仅须要改动P层了或者遇到逻辑上的大概我们能够直接从写一个P也能够,如今我看过的大多数开发把全部的东西都写在了Activity里面这样一来遇到改频繁改需求的时候,Activity里面就会被写的乱糟糟,所以想到了这个MVP模式希望能帮助到大家,大家是不是认为MVP非常不错呢?认为不错的同学们就应用到你的实战开发中去吧~!