浅谈mvp架构模式
浅谈mvp架构模式
MVP架构
MVP是 model,view,presenter的缩写,分别代表着数据,视图和发布层。mvp的前身是mvc,他和mvc最显著的区别在于mvp中的view层不直接与model通信,所有的通信交流都发生在presenter上。在传统的Model View Controller(MVC)中,我们将所有的业务逻辑放入Controller中,这样导致Controller将异常的庞大,导致我们的程序的可维护性和可测试性非常的差,视图和控制器过于紧密的联系,妨碍了其独立重用;视图对数据模型的低效率访问,也损害了操作性能。基于传统MVC的不足,衍生出了MVP。
View: 是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口。View通常含有Presenter的引用。在Android开发中通常将Activity或者Fragment作为View层。
Model: 对于Model层也是数据层。它区别于MVC架构中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等。
Presenter:对于Presenter层他是连接View层与Model层的桥梁并对业务逻辑进行处理。在MVP架构中Model与View无法直接进行交互。所以在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示。这样通过Presenter将View与Model进行隔离,使得View和Model之间不存在耦合,同时也将业务逻辑从View中抽离。
MVP的优点
MVP分离了view和model层,Presenter层充当了桥梁的角色,View层只负责更新界面即可,这里的View我们要明白只是一个viewinterface,它是视图的接口,这样我们在做单元测试的时候可以非常方便Presenter代码。
厚重的Controller层代码也得到了释放尽管大家会将Service层做分离,如net层,DB层等,但还是无法避免类似的问题,activity uicontroller无法重复利用是非常难以忍受的。
有一点还需要注意,presenter是双向绑定的关系,因此,在设计的时候就要注意接口和抽象的使用,尽可能的降低代码的耦合度,这也是mvp的宗旨。
MVP实例
这里我编写了一个非常简单的MVP程序,该程序就是在界面点击按钮后显示一条文本信息。首先看一下整体的架构
bean包
package com.example.mvpapplication.bean;
/**
* Created by 刘航伸 on 2017/6/26.
* 所展示数据的实体类
*/
public class Info {
private String content;
public Info(String content){
this.content = content;
}
public void setContent(String content){
this.content = content;
}
public String getContent(){
return this.content;
}
}
presenter包
package com.example.mvpapplication.presenter;
import com.example.mvpapplication.bean.Info;
import com.example.mvpapplication.view.ShowInfo;
/**
* Created by 刘航伸 on 2017/6/26.
* presenter的具体实现类,封装了该程序的业务逻辑
* 这里只是简单展示信息
*/
public class ShowInfoPresenter {
private Info info;
private ShowInfo showInfo;
public ShowInfoPresenter(ShowInfo showInfo) {
this.showInfo = showInfo;
}
public void showInfo(){
info = new Info("MVP架构实例");
showInfo.showInfo(info);
}
}
view包
package com.example.mvpapplication.view;
import com.example.mvpapplication.bean.Info;
/**
* Created by 刘航伸 on 2017/6/26.
*/
public interface ShowInfo {
public void showInfo(Info info);
}
package com.example.mvpapplication.view;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.mvpapplication.R;
import com.example.mvpapplication.bean.Info;
import com.example.mvpapplication.presenter.ShowInfoPresenter;
/**
* Created by 刘航伸 on 2017/6/26.
*/
public class ShowInfoImpl extends Activity implements ShowInfo,View.OnClickListener{
private Button showInfoButton;
private TextView textView;
private ShowInfoPresenter showInfoPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showInfoButton = (Button)findViewById(R.id.showInfoButton);
textView = (TextView)findViewById((R.id.textView));
showInfoPresenter = new ShowInfoPresenter(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.showInfoButton:
showInfoPresenter.showInfo();
}
}
@Override
public void showInfo(Info info) {
textView.setText(info.getContent());
}
}
“`