MVP框架之双向代理设计

阅读这篇文章需要掌握的知识代理模式

在上篇文章中我们实现了一个简单的Mvp模式初识MVP模式,通过中介者模式在MvpBasePresenter中关联M和V,以达到M和V的解耦。而这篇文章是在原来的基础,通过加入双向代理设计使代码结构更加清晰,但也更为复杂难懂。
何为双向代理

  1. 代理生命周期
  2. 代理P层

第一重代理:Activity生命周期的代理

通常情况下,MVP模式中Activity的onCreate和onDestroy分别会做P的创建、view的attachView和detachView的操作,但此时通过实现一层代理,通过代理生命周期(目标接口——目标对象——代理对象),把具体这些操作在我们自己实现的目标对象中完成,而Activity只需通过代理目标对象即可。这样也使得Activity中的代码被抽取出来,真正需要关心的是目标对象的内容。虽然这里只是把P的创建、view的绑定和解绑举例子,可能并不觉得这层代理的必要性,但以后如过要对P层缓存和View缓存做一系列的操作,所有的代码都写在Activity或则Fragment中这样就会是其代码显得很臃肿不清晰,换而言之在自己实现的目标对象中完成这些功能,而Activity或Fragment只需实现对目标对象的代理,这样也使得整体框架代码的结构更清晰明了、功能更单一,也更符合代码设计的原则。说了这么多接下来就来看看实现吧:

第一步:代理Activity的生命周期,先实现一个目标接口(onCreate、onRestoreInstanceState、onStart、onResume、onPause、onSaveInstanceState、onStop、onDestroy)

//第一重代理——》生命周期(目标接口)
public interface ActivityMvpDelegate >{
    void onCreate(Bundle savedInstanceState);

    void onRestoreInstanceState(Bundle savedInstanceState);

    void onStart();

    void onResume();

    void onPause();

    void onSaveInstanceState(Bundle outState);

    void onStop();

    void onDestroy();
}

第二步:实现目标对象ActivityMvpDelegateImpl,并目标对象实现目标接口ActivityMvpDelegate

// 第一重代理——》生命周期(目标对象——实现目标接口)
public class ActivityMvpDelegateImpl> implements ActivityMvpDelegate {

    @Override public void onCreate(Bundle savedInstanceState) {
    }

    @Override public void onRestoreInstanceState(Bundle savedInstanceState) {
    }

    @Override public void onStart() {
    }

    @Override public void onResume() {
    }

    @Override public void onPause() {
    }

    @Override public void onSaveInstanceState(Bundle outState) {
    }

    @Override public void onStop() {
    }

    @Override public void onDestroy() {
    }
}

第三步:Activity就是生命周期的代理对象,在代理对象中有个重要的特性就是持有目标对象的引用,在Activity的生命周期方法中,分别代理目标对象ActivityMvpDelegateImpl对应的方法。

//第一重代理——》生命周期代理(代理对象——持有目标对象)
public abstract class MvpActivity> extends AppCompatActivity implements MvpVie{

    private ActivityMvpDelegate   mvpDelegate;

    private ActivityMvpDelegate getMvpDelegate() {
        if (mvpDelegate == null) {
            mvpDelegate = new ActivityMvpDelegateImpl(this);
        }
        return mvpDelegate;
    }

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getMvpDelegate().onCreate(savedInstanceState);

    }

    @Override protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        getMvpDelegate().onRestoreInstanceState(savedInstanceState);
    }

    @Override protected void onStart() {
        super.onStart();
        getMvpDelegate().onStart();
    }

    @Override protected void onResume() {
        super.onResume();
        getMvpDelegate().onResume();
    }

    @Override protected void onPause() {
        super.onPause();
        getMvpDelegate().onPause();
    }

    @Override protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getMvpDelegate().onSaveInstanceState(outState);

    }

    @Override protected void onStop() {
        super.onStop();
        getMvpDelegate().onStop();
    }

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

通过以上三步就实现了对Activity生命周期的代理,但是在目标对象ActivityMvpDelegateImpl还没有做具体的操作。那接下来要做的就是对P层的创建和View的绑定和解绑,也就是P层的代理。

第二重代理:P层代理

同样也需要三步(目标接口——目标对象——代理对象)

第一步:实现MvpDelegateCallback

//第二重代理——》P层的代理(目标接口)
public interface MvpDelegateCallback> {

    P createPresenter();

    P getPresenter();

    void setPresenter(P presenter);

    V getMvpView();

}

第二步:实现目标对象,而这里的目标对象是MvpActivity,并实现目标接口MvpDelegateCallback,这时MvpAvtivity中的代码如下

//第一重代理——》生命周期代理(代理对象——持有目标对象)
//第二重代理——》P层代理(目标对象——实现目标接口)
public abstract class MvpActivity> extends AppCompatActivity implements MvpView, MvpDelegateCallback {

    private P                           presenter;

    private ActivityMvpDelegate   mvpDelegate;

    private ActivityMvpDelegate getMvpDelegate() {
        if (mvpDelegate == null) {
            mvpDelegate = new ActivityMvpDelegateImpl();
        }
        return mvpDelegate;
    }

    /* ===============第二重代理================= */
    @Override public P createPresenter() {
        return presenter;
    }

    @Override public P getPresenter() {
        return presenter;
    }

    @Override public void setPresenter(P presenter) {
        this.presenter = presenter;
    }

    @Override public V getMvpView() {
        return (V) this;
    }

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getMvpDelegate().onCreate(savedInstanceState);

    }

    @Override protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        getMvpDelegate().onRestoreInstanceState(savedInstanceState);
    }

    @Override protected void onStart() {
        super.onStart();
        getMvpDelegate().onStart();
    }

    @Override protected void onResume() {
        super.onResume();
        getMvpDelegate().onResume();
    }

    @Override protected void onPause() {
        super.onPause();
        getMvpDelegate().onPause();
    }

    @Override protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getMvpDelegate().onSaveInstanceState(outState);

    }

    @Override protected void onStop() {
        super.onStop();
        getMvpDelegate().onStop();
    }

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

第三步:实现代理P层的代理对象ProxyMvpDelegateCallback,根据代理对象的特性,持有目标对象的引用、实现目标接口(并不是必须的),代码如下:

// 第二重代理——》P层代理(代理对象——持有目标对象,实现目标接口)
public class ProxyMvpDelegateCallback> implements MvpDelegateCallback {

    // 持有目标对象的引用,————————实际上就是MvpActivity
    private MvpDelegateCallback mvpCallback;

    public ProxyMvpDelegateCallback(MvpDelegateCallback mvpCallback) {
        this.mvpCallback = mvpCallback;
    }

    @Override public P createPresenter() {
        P presenter = this.mvpCallback.getPresenter();
        if (presenter == null) {
            presenter = this.mvpCallback.createPresenter();
        }
        if (presenter == null) {
            throw new NullPointerException("P层不能为空");
        }
        this.setPresenter(presenter);
        return presenter;
    }

    @Override public P getPresenter() {
        return this.mvpCallback.getPresenter();
    }

    @Override public void setPresenter(P presenter) {
        this.mvpCallback.setPresenter(presenter);
    }

    @Override public V getMvpView() {
        return this.mvpCallback.getMvpView();
    }

    /* ===============添加两个重要的方法——绑定和解绑================= */
    public void attachView() {
        getPresenter().attachView(getMvpView());
    }

    public void detachView() {
        getPresenter().detachView();
    }
}

双重代理的关联

通过以上三步,已经实现了对P层的代理。但是有没有发现,虽然实现对P层的代理但P层的创建以及View的绑定和解绑并没有与Activity的生命周期关联起来。还记得在实现代理生命周期的时候说的 ,虽然实现了对生命周期的代理,但在目标对象ActivityMvpDelegateImpl中并没有做具体的操作。也就是说我们需要在ActivityMvpDelegateImpl做关联双向代理的的操作,如P层的创建、view的绑定与解绑。

在ActivityMvpDelegateImpl类中在其构造方法中创建ProxyMvpDelegateCallback代理对象,在onCreate调用ProxyMvpDelegateCallback的createPresenter、attachView方法,在onDestroy中调用ProxyMvpDelegateCallback的detachView,ActivityMvpDelegateImpl最终代码如下:

// 第一重代理——》生命周期(目标对象——实现目标接口)
public class ActivityMvpDelegateImpl> implements ActivityMvpDelegate {

    private ProxyMvpDelegateCallback mvpCallback;

    //双重代理的关联
    public ActivityMvpDelegateImpl(MvpDelegateCallback mvpDelegateCallback) {
        mvpCallback = new ProxyMvpDelegateCallback(mvpDelegateCallback);
    }

    @Override public void onCreate(Bundle savedInstanceState) {
        mvpCallback.createPresenter();
        mvpCallback.attachView();

    }

    @Override public void onRestoreInstanceState(Bundle savedInstanceState) {

    }

    @Override public void onStart() {

    }

    @Override public void onResume() {

    }

    @Override public void onPause() {

    }

    @Override public void onSaveInstanceState(Bundle outState) {

    }

    @Override public void onStop() {

    }

    @Override public void onDestroy() {
        mvpCallback.detachView();

    }
}

还需要把MvpActivity创建ActivityMvpDelegateImpl方法改为如下代码:

private ActivityMvpDelegate getMvpDelegate() {
    if (mvpDelegate == null) {
        mvpDelegate = new ActivityMvpDelegateImpl(this);
    }
    return mvpDelegate;
}

到这里双向代理设计已经全部完了,最后把整篇文章做个总结,对其内容实现梳理:

  • MvpActivity在生命周期的代理中扮演代理对象的角色,当一个Activity创建时会执行onCreate,因其代理对象角色,会执行被代理对象(目标对象)的方法,在这里也就是ActivityMvpDelegateImpl的onCreate方法
    @Override public void onCreate(Bundle savedInstanceState) {
        this.proxyMvpCallback.createPresenter();
        this.proxyMvpCallback. attachView();
    }
  • 在ActivityMvpDelegateImpl中因为其关联了P层代理的代理对象ProxyMvpDelegateCallback,并执行其createPresenter和attachView,又因其是代理对象的原因,最终执行的是被代理的目标对象Activity的createPresenter,所以这里MvpActivity在P层代理时其角色又是目标对象。

关于MvpFragment双向代理的实现就不再介绍,内容和Activity的实现基本上是一致的。最后贴上源码地址github,里面有MvpFragment实现代码。同时也欢迎大家拍砖提供宝贵意见,共同进步。


风后面是风,天空上面是天空,而你的生活可以与众不同

你可能感兴趣的:(MVP框架之双向代理设计)