MVP模式初学博客

MVP模式的理解和整理
MVP模式从入门到精通
最适合android的MVP模式
MVP模式是你的救命稻草吗?
设计模式笔记之一:MVP架构模式入门(转)
Android MVP 实例运用
Android MVP模式进阶版——拿去直接用

Android MVP介绍

随着技术的发展,Activity(View) 做的事情越来越多,动辄几百上千行的代码使得 Activity 越来越臃肿。为了更好的划分视图(View)和模型(Model)之间的职责,让 View 只处理数据的展示和用户的交互,把数据的处理交由 Model 处理。

在MVP模式里通常包含4个要素:

View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity,Fragment),与Android平台相关的东西基本上都被隔离在View层;
View interface:需要View实现的接口,View通过View interface接口与Presenter进行交互,降低耦合,方便进行单元测试;
Model:负责存储、检索、操纵数据(有时也实现一个Model interface接口用来降低耦合),比如实体类Bean,网络请求以及json解析;
Presenter:作为View与Model交互的中间纽带,处理与用户交互的业务逻辑和调度View和Model。adapter也是Presenter。Presenter的理想境界都是纯Java的东西

MVP模式图
箭头表示调用,即View和Model层是没有【直接】调用交互关系的,View只能和Presenter形成相互调用关系,Presenter单向调用Model的数据进行逻辑处理。

MVP中可以利用Contract接口把P和V的所有方法接口全部写在一起,看起来代码格外清楚,所有的功能清清楚楚,其实只要看这个Contract差不多所有的功能就已经有所了解了。当接口变多了,Contract优势明显出来了,一目了然,相比而言,写一个个接口把他们都写在一起这种做法还是不错的。
废话不多说,直接上代码(参考Android MVP模式进阶版——拿去直接用):
布局是android新建项目自动生成的helloworld此处不表。
首先是View和presenter的接口,抽象出view对象的绑定方法。
IView.java

public interface IView {
                void bindView();
                void UnbindView();
        }

IPresenter.java

public interface IPresenter<V> {
    void register(V view);
    void unRegister();
}

BasePresenter实现IPresenter接口,为业务逻辑层presenter的基类。用弱引用来接收View的对象,在取消注册的时候销毁view对象,保证View不会造成内存泄漏。
BasePresenter.java

public class BasePresenter<V> implements IPresenter<V> {
    protected WeakReference<V> iView;

    @Override
    public void register(V view) {
        iView = new WeakReference<V>(view);
    }

    @Override
    public void unRegister() {
        iView.clear();
    }
}

BaseActivity实现IView接口,为视图层的基类(也就是Activity的基类),这是一个抽象类,实现了视图层到业务逻辑层的绑定与解绑,抽象方法createPresenter()子类必须实现,来确保不通的业务逻辑层。

BaseActivity.java

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IView {
    protected P iPresenter;
    protected abstract P createPresenter();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bindView();
    }

    @Override
    public void bindView() {
        iPresenter = createPresenter();
        iPresenter.register(this);
    }

    @Override
    public void UnbindView() {
        iPresenter.unRegister();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        UnbindView();
    }
}

接下来是具体的使用MVP的流程了,定义三方交接合同接口

public interface MainContract {
    interface View{
        void demoView(String test);
    }

    interface Presenter{
        void demoPresenter();
    }

    interface Model{
        void demoModel(ModelListener modelListener);

        interface ModelListener{
            void completed(String test);
        }
    }
}

视图层View

public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.View {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iPresenter.demoPresenter();
    }

    @Override
    protected MainPresenter createPresenter() {
        return new MainPresenter();
    }

    @Override
    public void demoView(String test) {
        Toast.makeText(this,test,Toast.LENGTH_LONG).show();
    }
}

业务逻辑层Presenter

public class MainPresenter extends BasePresenter<MainActivity> implements MainContract.Presenter {
    MainContract.Model model=new MainModel();
    @Override
    public void demoPresenter() {
        model.demoModel(new MainContract.Model.ModelListener() {
            @Override
            public void completed(String test) {
                iView.get().demoView(test);
            }
        });
    }
}

数据实体层 Model

public class MainModel implements MainContract.Model {
    @Override
    public void demoModel(ModelListener modelListener) {
        modelListener.completed("mvp test");//mvp test就是一个字符串数据
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值