MVP的理解与使用
角色:
Presenter---交互中间人
作为View和Model沟通的桥梁,它从Model层获取到数据,返回给View层,使得View和Model之间完全解耦,并且将业务逻辑从View中抽离出来。
View---用户界面
View通常指Activity、Fragment或者某个View控件,它持有一个Presenter成员变量。通常View需要实现一个接口,将View上的操作转交给Presenter进行实现,最后,Presenter调用View逻辑接口将结果返回给View
Model---数据仓库
Model主要作用就是提供数据的存储功能。Presenter通过Model层存储、获取数据,返回给View
特点:通过接口进行通信,降低耦合。
吐槽:使用MVP使得整个应用充斥着各种零零散散的接口,对于简单的应用来说,显得格外的繁琐。
点赞:MVP模式使得每一个类代码量减少,职责单一,易于维护。
话外:我自己认为MVP其实没有什么标准化的模板,只要保证通过Present将View和Model解耦,使得各个模块独立化,便于后期维护,就是MVP。
概念永远不可能让人真正理解一个知识,接下来就用一个很简单的案例来教大家怎么写一个MVP模式。
先说一个场景:一个人(Model)想要出名,首先得有记者(Presenter)采访你,才有机会,他要把他的信息让他的助理(Model接口引用)暴露给记者,而记者每天采访好多人,他需要把采访的信息进行处理(业务逻辑),他在处理过程中需要对应的编辑(View)进行确认,比如说他整理出来一份凤姐的资料,然后需要问其中一个编辑的助理(View接口的引用)(编辑很忙的,不可能一直待在记者的办公室):凤姐的信息给你可以吗?编辑助理满意了之后才能让记者的助理(Presenter的接口引用)把信息传递给编辑(View),编辑只负责展示这个人的信息,他从来不管记者是通过什么途径来获取这些信息,当然凤姐(Model)也不会直接和编辑打交道,他们之间的交互就靠中间人--记者(Presenter)。
综上所述:Presenter层需要有View和Model的接口引用,而View层需要有Presenter层的接口引用
好了,大家应该很容易就理解上面的所说的场景,接下来先展示一下app显示:
在看一下基本的架构:
接下来直接上代码:
Model层:
/**
* 这个User类就是Model层
*/
public class User {
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
private String username;
}
/**
* Model接口
*/
public interface IUser {
String sendData();
}
/**
* Model接口实现类
*/
public class IUserImpl implements IUser {
@Override
public String sendData() {
User user = new User();
user.setUsername("fengjie");
return user.getUsername();
}
}
Presenter层:
/**
* Presenter接口
*/
public interface MainPresenter {
String dealData(); //处理业务逻辑的方法
}
/**
* Presenter接口的实现类
*/
public class MainPresenterImpl implements MainPresenter {
private MainView mMainView; //View接口的引用
private IUserImpl mIUser = new IUserImpl();//Model接口的引用
public MainPresenterImpl(MainView mainView) {
this.mMainView = mainView;
}
//Presenter处理业务的逻辑的方法
@Override
public String dealData() {
//View层调用获取数据的方法
String viewData = mMainView.getData();
//Model层调用提供数据的方法
String data = mIUser.sendData();
if (data.equals(viewData)) { //如果提供的数据和想要获取的数据一致
mMainView.RightData(); //View层给出正确的提示
return data; // 将数据返回
} else {
mMainView.ErrorData(); //View层给出错误的提示
mMainView.ClearError(); //View层将错误信息删除
return "";
}
}
}
View层:
public class MainActivity extends AppCompatActivity implements MainView, View.OnClickListener {
private MainPresenter mMainPresenter; //Presenter层的接口引用
private EditText mEtData;
private TextView mTvData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainPresenter = new MainPresenterImpl(this);
Button btn = (Button) findViewById(R.id.btnGetData);
btn.setOnClickListener(this);
mEtData = (EditText) findViewById(R.id.etData);
mTvData = (TextView) findViewById(R.id.tvData);
}
@Override
public String getData() {
String data = mEtData.getText().toString().trim();
return data;
}
@Override
public void ErrorData() {
Toast.makeText(this, "我要的是凤姐,不是其他人", Toast.LENGTH_SHORT).show();
}
@Override
public void RightData() {
Toast.makeText(this, "谢谢你给了我这么好看的凤姐", Toast.LENGTH_SHORT).show();
}
@Override
public void ClearError() {
mTvData.setText("");
}
@Override
public void onClick(View v) {
String s = mMainPresenter.dealData();
mTvData.setText(s);
}
}
/**
* View层接口
*/
public interface MainView {
String getData(); //获取数据的抽象方法
void ErrorData();
void RightData();
void ClearError();
}
相信大家看完后MVP模式应该可以很好的理解和应用了!永远记住一点:只有Presenter层才可以处理业务逻辑,Model层只提供数据,View层只修改UI。