MVP架构介绍
Android开发三大框架,MVC,MVP,MVVM,简单介绍下其余两种
MVC
M(Model)是数据模型,或者数据处理,V(View)是视图控件,C(controller)是逻辑控制类,MVC是以前常用或者老式的项目用的比较多,优势和缺陷都相当明显,感觉并会没有彻底做到VC分离的效果
优势:除了model是独立的,V和C在Activity中体现最为明显,Activity即作为V,也作为C,处理逻辑业务和UI交互非常方便,都在一个Activity里面搞定。
缺陷:它的优势也是它的缺陷,过度集成在同一个Activity里面,耦合度也比较强,抽离的话也有可能涉及到引用持有问题,代码量和逻辑会越来越多,越来不清晰,日后想要维护或者新增功能,成本会很高。
MVVM
View: 对应于Activity和XML,负责View的绘制以及与用户交互。
Model: 实体模型。
ViewModel: 负责完成View与Model间的交互,负责业务逻辑。
MVVM目的也是为了彻底分离控件和数据的架构,它主要是依靠DataBinding进行数据绑定,作用就是讲数据和控件绑定起来,当数据进行改变的时候,会自动刷新View,由于本人没用过,所以没什么发言权
MVP
MVP架构是当前比较流行开发框架,相比于MVVM,我觉得相比就多了一个更新数据的步骤,但是MVP的实现是不需要依赖框架,也是优势之一,灵活。
原理:将数据M层获取数据,由P层进行完成MV业务逻辑交互和数据更新逻辑,然后将数据结果传递给V层进行UI数据更新和UI业务处理。
作用:将M层和V层彻底隔离出来,每个层只需要负责自己的逻辑,然后要交互其它层,就经过P层开放的接口去处理。达到代码分割效果。
缺点:一个功能模块可能就需要一个P类,一个成熟的MVP项目会需要创建很多很多的契约类和P层类,且P层的代码量也会越来越重,维护相比MVC来说还是好很多倍了。
刚说了MVP的好处就是不需要依赖框架,所以实现起来也有灵活,可以配合各种模式实现MVP
MVP例子:
1.先创建些基本的契约类,BaseView用于P层View的结果回调,BasePresenter用于对应P类的初始化。当然也创建一个具体模块的测试契约类
public interface BaseContact {
interface BaseView {
void onSuccess();
void onFail();
}
interface BasePresenter<V>{
void onCreatePresenter();
void init(V view);
}
}
public interface TestContact{
interface View extends BaseContact.BaseView{
void showSomething(String msg);
}
interface Presenter<T> extends BaseContact.BasePresenter<T>{
void test(String msg);
}
}
2.创建基础的P类 和 下层具体模块的P类
public class BasePresenter <V extends BaseContact.BaseView> implements BaseContact.BasePresenter<V> {
public V mView;
@Override
public void onCreatePresenter() {
}
@Override
public void init(V view) {
this.mView = view;
}
}
public class TestPresenter extends BasePresenter<TestContact.View> implements TestContact.Presenter<TestContact.View> {
TestModel testModel;
public TestPresenter() {
testModel = new TestModel();
}
@Override
public void test(final String msg) {
testModel.test(msg, new TestCallBack() {
@Override
public void onSuccess() {
mView.showSomething(msg);
}
@Override
public void onError() {
mView.showSomething("错误");
}
});
}
}
3.采用注解+工厂的形式去创建下层具体的P类(重点)
/**
* 生成presenter注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface OnCreateClass {
Class<? extends BaseContact.BasePresenter> value();
}
4.创建P类的工厂,根据注解生成对应的P层对象
public class PresenterFactory {
/**
* 创建P层实例对象
* @param object
* @param <T>
* @return
*/
public static <T extends BaseContact.BasePresenter> T createPresenter(Object object){
OnCreateClass annotation = object.getClass().getAnnotation(OnCreateClass.class);
T mPresenter = null;
if (annotation != null && annotation.value() instanceof Class){
Class<T> classObject = (Class<T>) annotation.value();
try {
mPresenter = classObject.newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
return mPresenter;
}
}
5.M层和V层的逻辑就更简单了,直接继承调用P的内容就可以完成交互,前提是要记得写上对应的P类注解,否则工厂无法生成对应的P对象
V层:
public class BaseActivity <V extends BaseContact.BaseView, P extends BaseContact.BasePresenter> extends AppCompatActivity implements BaseContact.BaseView {
public P mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = PresenterFactory.createPresenter(this);
mPresenter.init( (V)this);
}
public P getPresenter(){
return mPresenter;
}
@Override
public void onSuccess() {
}
@Override
public void onFail() {
}
}
@OnCreateClass(TestPresenter.class)
public class TestClassTimeActivity extends BaseActivity<TestContact.View, TestContact.Presenter> implements TestContact.View {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
init();
}
private void init() {
getPresenter().test("提示");
}
@Override
public void showSomething(String Msg) {
Toast.makeText(this, Msg, Toast.LENGTH_SHORT).show();
}
}
M层:
/**
* M层
*/
public class TestModel {
public void test(String Msg, TestCallBack callBack){
if (Msg != null){
callBack.onSuccess();
}else {
callBack.onError();
}
}
}
public interface TestCallBack {
void onSuccess();
void onError();
}
就这样简单的搭建了一个基本的MVP架构,当然成熟的项目用MVP里面可能还需要继续封装多层,包括网络的,生命周期管理,配合其他模式一起使用,如代理模式,单例的等等,根据项目需要进行各种组合,这一点我觉得是很不错的。
无论怎么组合,M层和V层的交互都是有P层实现,在回调通知另一方
但整体原理和架构基本就是这样,采用注解+工厂的方式去创建P类,可以省下很多不必要的功夫,而且获取到的P类为空的概率风险也降低。
来源:CSDN
作者:力_
链接:https://blog.csdn.net/qq_28528171/article/details/104015067