MVP architecture, mvp architecture android
I. Introduction
The Model View Presenter architecture evolved from the famous Model View Controller Architecture. For Android applications, the development can be regarded as the MVC Architecture, the layout file is regarded as the View, and the Activity is regarded as the Controller, but the Activity also controls the layout update. Therefore, the Activity is the combination of the Controller and the View, the result is that the Actiivty code is also messy, and the MVP is to separate the Controller played by the Activity from the View role.
View:The View layer is also the View layer. In the View layer, it only displays data and provides a friendly interface for interaction with users. In Android development, Activity or Fragment is usually used as the View layer.
Model:The Model layer is also the data layer. It is different from the Model in MVC, where it is not just a data Model. In the MVP architecture, the Model is responsible for data access, such as data reading and network data requests.
Presenter:The Presenter layer is also a bridge between the View layer and the Model layer and processes the business logic. In the MVP architecture, the Model and View cannot interact directly. Therefore, in the Presenter layer, it will obtain the required data from the Model layer, perform some appropriate processing, and then hand it to the View layer for display. In this way, the Presenter isolates the View from the Model, so that there is no coupling between the View and Model, and colleagues also extract the business logic from the View.
In the MVP architecture, these three layers are abstracted into their respective interfaces. The layers are isolated through interfaces, and the Presenter's dependency on View and Model is also dependent on their respective interfaces. This conforms to the interface isolation principle, and is also oriented to interface programming. The Presenter layer contains a View Interface and relies on the Model interface to associate the Model layer with the View layer. For the View layer, a Presnter member variable is held and only the call to the Presenter interface is retained. The specific business logic is handled by the Presnter interface implementation class.
Ii. Benefits
1. View and Model are connected to each other through Presenter instead of directly interacting. The View does not contain a Model, so there is no business logic.
2. The interaction between Presenter and View is implemented through interfaces, which has a low coupling degree and is also conducive to unit testing.
3. Presenter is behavior-based. A Presnter can be used for multiple views, enhancing code reuse.
Iii. Use
Use the MVP architecture to display a ListView.
1. Define a Mode Interface
public interface IMode { List<String> getDatas();}
2. Define an IView Interface
public interface IView { void showProgress(); void hideProgress(); void showText(String text); void showDatas(List<String> datas); void showToast(String message);}
3. Define a Presenter Interface
public interface IPresenter { void getDataList(); void onItemClick(int position);}
4. Define the MainMode class to implement the IMode Interface
public class MainMode implements IMode { @Override public List<String> getDatas() { List<String> datas = new ArrayList<>(); //return datas; datas.add("A"); datas.add("B"); datas.add("C"); datas.add("D"); datas.add("E"); datas.add("F"); return datas; //return null; }}
5. Define the MainPresenter class to implement the IPresenter Interface
Public class MainPresenter implements IPresenter {private IView mView; private IMode mMode; public MainPresenter (IView mView) {this. mView = mView; mMode = new MainMode () ;}@ Override public void getDataList () {mView. showProgress (); new Handler (). postDelayed (new Runnable () {@ Override public void run () {List <String> datas = mMode. getDatas (); mView. hideProgress (); if (datas = null) {// failed to get data mVi Ew. showText ("data request failed! ");} Else {// data obtained successfully if (datas. size () = 0) {// data is empty mView. showText (" data is empty! ");} Else {mView. showDatas (datas) ;}}}, 2000) ;}@ Override public void onItemClick (int position) {mView. showToast (String. format ("Position % d clicked", position + 1 ));}}
6. Define the MainActivity class to implement the IView Interface
public class MainActivity extends AppCompatActivity implements IView, AdapterView.OnItemClickListener { private ListView mListView; private ProgressBar mProgressBar; private TextView mTextView; private IPresenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.list); mProgressBar = (ProgressBar) findViewById(R.id.progress); mTextView = (TextView) findViewById(R.id.text); mPresenter = new MainPresenter(this); mPresenter.getDataList(); } @Override public void showProgress() { mProgressBar.setVisibility(View.VISIBLE); mListView.setVisibility(View.GONE); } @Override public void hideProgress() { mProgressBar.setVisibility(View.GONE); mListView.setVisibility(View.VISIBLE); } @Override public void showText(String text) { mProgressBar.setVisibility(View.GONE); mListView.setVisibility(View.GONE); mTextView.setVisibility(View.VISIBLE); mTextView.setText(text); } @Override public void showDatas(List<String> datas) { mListView.setAdapter(new ArrayAdapter<>(this, R.layout.simple_list_item, datas)); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mPresenter.onItemClick(position); } @Override public void showToast(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); }}
Code address: Https://github.com/ZhangMiao147/FrameworkDemo
References:
Http://www.lai18.com/content/7010875.html
Http://www.lai18.com/content/2453405.html
Http://www.lai18.com/content/475341.html
Http://www.lai18.com/content/24630178.html
Http://www.lai18.com/content/719388.html
Http://www.lai18.com/content/7017296.html