Android开发—MVPO框架模式(二)

前言

  在前一章中,题主虽然没有展开讲解MVPO究竟是啥东西,但也针对传统MVP做出了一点改进。而在这一章中,我们将继续探讨第二个问题,并引出MVPO框架模式。

传统MVP的第二个问题

  假如有这样一个需求:App先通过接口从服务器获取时间戳,再通过蓝牙把这个时间发给IOT设备,最后App再通过网络请求上报服务器处理结果。为了方便理解,下面这个图展示了该需求:

Android开发—MVPO框架模式(二)_第1张图片
image.png

  针对以上需求,传统MVP一般这样做:写一个Presenter包含网络请求和蓝牙交互的所有逻辑。但这样一来,P层就会很臃肿。而且还有另一个问题,如果某个页面只想用获取时间戳的操作,那这个Presenter对于这个页面显然过于“浪费”。

解决之道

题主解决上面问题的方法,其实就是用MVPO框架,简单说就是在MVP的基础上,加多一层O(Operator)。
还是用代码说话,针对上面提到的需求,如果用MVPO框架,关键两层的代码如下:

CommandPresenter

public class CommandPresenter {
    /**
     * 从服务器获取时间戳
     */
    public static void getCommand(String type, BaseObserver observer) {
        observer.addParam("type", type)
                .post(AppConfig.UrlConfig.GET_COMMAND);
    }

SyncTimeOperator

/**
 * 同步时间操作类
 * @author LvQiSheng
 * @date 2019/5/27
 */
public class SyncTimeOperator {
    private SyncTimeCallback mCallback;

    public interface SyncTimeCallback {
        void onFailure(String msg);

        void onSuccess();
    }

    public SyncTimeOperator(SyncTimeCallback callback) {
        this.mCallback = callback;
    }

    /**
     * 执行完整操作
     */
    public void execute() {
        getServerTime();
    }

    /**
     * 从服务器获取时间戳
     */
    private void getServerTime() {
        CommandPresenter.getCommand("1", new BaseObserver(null) {
            @Override
            public void onSuccess(TimeResult timeResult) {
                sendTimeBytBle(timeResult.getTime());
            }

            @Override
            public void onError(String code, String msg) {
                mCallback.onFailure(msg);
            }
        });
    }

    /**
     * 通过蓝牙把时间同步给IOT设备
     */
    private   void syncTimeIot(long time) {
        BleManager.sendDatasByMac(mac, time, new BleSendDataCallback() {
            @Override
            public void onFailure(ErrorType errorType, BleException exception, String sendCmd) {
                mCallback.onFailure(exception.toString());
            }

            @Override
            public void onDataReceived(String mac, byte[] data) {
                reportResult(true);
            }
        });
    }

    /**
     * 上报结果给服务器
     */
    private void reportResult(boolean isSuccess) {
        CommandPresenter.reportResult("1", isSuccess, new BaseObserver(null) {
            @Override
            public void onSuccess(CommandResult commandResult) {
                mCallback.onSuccess();
            }

            @Override
            public void onError(String code, String msg) {
                mCallback.onFailure(msg);
            }
        });
    }
}

解释

  1. Presenter还是只专注于网络请求,相当于一块积木。
  2. 蓝牙交互的封装(BleManager)则是另一块积木。
  3. 以上两块积木,可以单独使用。比如某全页面只需要网络请求,则调Presenter。如果只有蓝牙交互,则调BleManager。
  4. 当View层夹杂着网络请求加蓝牙交互等复杂操作时,则新建一个Operator,把以上两块积木组合起来便可。

结语

本文介绍了一种改进后的MVP框架模式——MVPO,适用于逻辑比较复杂的App。个人认为,物联网产品的App会比较适用,也欢迎各位Android开发的小伙伴提出改进意见。

你可能感兴趣的:(Android开发—MVPO框架模式(二))