移动架构31_责任链和模板模式封装连续请求

Android移动架构汇总​​​​​​​
Demo地址:
https://gitee.com/YuBaoZi/codes/krbjs78p96fa4cnwyqho176
##一、 需求
处理链式请求
需求分析:通常我们会遇到这样的情况,先去判断一个逻辑(有可能是异步的),当结果为一种情况时,继续执行下一步,再去判断;直到最终,如:
获取用户手机号->获取用户资产信息->购买产品
原理:每一步处理,都有请求、处理通过、处理不通过的逻辑,只是具体的内容不同,用抽象方法;
每个处理封装成一个对象,通过java的对象引用产生关联;
每个处理对象依赖上一个处理的结果,因此要将处理结果传递下去;
移动架构16_模板模式

##二、代码
###1、BaseHandler

/**
 * @param <M> 上一个处理环节的结果的类型
 * @param <T> 当前处理环节的结果的类型
 *            使用示例:
 *            Handler<Void,Integer>  handler1 = new Handler1();
 *            Handler<Integer, String> handler2 = new Handler2();
 *            handler1.nextHandler = handler2;
 *            handler1.handle();
 * @author baopengjian
 *     每一个环节处理的模板 (责任链模式、模板模式 )
 */
public abstract class BaseHandler<M, T> {
    /**
     * 下一个处理环节
     */
    public BaseHandler<T, ?> nextHandler;
    /**
     * 当前环节处理的结果
     */
    private T result;

    /**
     * 通过第一个Handler的该方法,启动整个链式处理
     */
    public void handle() {
        request(null, new CallBack<T>() {
            @Override
            public void onSuccess(T result) {
                BaseHandler.this.result = result;
                handleSucess(null,result);
            }

            @Override
            public void onFail(T result) {
                BaseHandler.this.result = result;
                handleFail(null,result);
            }
        });
    }

    /**
     * 启动下一环节的处理,并传入当前处理结果
     * @param lastResult
     */
    protected void handle(final M lastResult) {
        request(lastResult, new CallBack<T>() {
            @Override
            public void onSuccess(T result) {
                BaseHandler.this.result = result;
                handleSucess(lastResult,result);
            }

            @Override
            public void onFail(T result) {
                BaseHandler.this.result = result;
                handleFail(lastResult,result);
            }
        });
    }
    /**
     * 如果需要传递到下一环节,该方法需要在request中当处理结束后被调用
     */
    protected void handleNext(){
        if(nextHandler != null){
            nextHandler.handle(result);
        }
    }
    /**
     * 当前环节处理成功
     */
    public void handleSucess(M lastResult,T result){
		handleNext();
	}
    /**
     * 当前环节处理失败
     * @param lastResult
     * @param result
     */
    public abstract void handleFail(M lastResult,T result);
    /**
     *  具体处理逻辑的抽象方法
     * @param lastResult
     * @param callBack 需要在实现中手动调用 callBack.onSucess和 callBack.onFail
     * 注意:是callBack 的onSucess不是handleSucess
     */
    public abstract void request(M lastResult,CallBack<T> callBack);

    /**
     * 处理结果的回调
     * @param <T> 结果类型
     */
    public  interface CallBack<T> {
        void onSuccess(T result);

        void onFail(T result);
    }
}

###2、BaseHandler的实现

public class Handler1 extends BaseHandler<Void,Integer> {

    @Override
    public void handleFail(Void lastResult, Integer result) {
        Log.i("Hand",">>> Handler1处理请求失败");
    }

    @Override
    public void request(Void lastResult, CallBack<Integer> callBack) {
        Log.i("Hand",">>> Handler1 开始请求request");
        Request request = new Request();
        request.request1(callBack);
    }
}
public class Handler2 extends BaseHandler<Integer,String> {

    @Override
    public void handleFail(Integer lastResult, String result) {
        Log.i("Hand",">>> Handler2处理请求失败");
    }

    @Override
    public void request(Integer lastResult, CallBack<String> callBack) {
        Log.i("Hand",">>> Handler2 开始请求request");
        Request request = new Request();
        request.request2(callBack);
    }
}
public class Handler3 extends BaseHandler<String, String> {

	@Override
    public void handleSucess(String lastResult, String result) {
        Log.i("Hand",">>>重写handleSucess Handler3不再向后传递");
    }
    
    @Override
    public void handleFail(String lastResult, String result) {
        Log.i("Hand",">>> Handler3处理请求失败");
    }

    @Override
    public void request(String lastResult, CallBack<String> callBack) {
        Log.i("Hand",">>> Handler3 开始请求request");
        Request request = new Request();
        request.request3(callBack);
    }
}

###3、模拟请求

public class Request {

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (callBack == null) {
                return;
            }
            switch (msg.what) {
                case 1:
                    int result = (int) msg.obj;
                       Log.i("Hand",">>> Handle1处理请求完成   当前处理结果:"+result);
                    if (result > 0){
                        callBack.onSuccess(result);
                    } else {
                        callBack.onFail(result);
                    }
                    break;
                case 2:
	                Log.i("Hand",">>> Handle2处理请求完成   当前处理结果:"+result);
                    String result2 = (String) msg.obj;
                    if ("0".equals(result2)) {
                        callBack.onSuccess(result2);
                    } else {
                        callBack.onFail(result2);
                    }
                    break;
                case 3:
                    String result3 = (String) msg.obj;
                     Log.i("Hand",">>> Handle3处理请求完成   当前处理结果:"+result3);
                    if ("结果3".equals(result3)) {
                        callBack.onSuccess(result3);
                    } else {
                        callBack.onFail(result3);
                    }
                    break;
                default:
                    break;
            }
        }
    };
    BaseHandler.CallBack callBack;

    public void request1(BaseHandler.CallBack<Integer> callBack) {
        this.callBack = callBack;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what = 1;
                msg.obj = 1;
                handler.sendMessage(msg);
            }
        }, 1000);
    }

    public void request2(BaseHandler.CallBack<String> callBack) {
        this.callBack = callBack;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what = 2;
                msg.obj = "0";
                handler.sendMessage(msg);
            }
        }, 2000);
    }

    public void request3(BaseHandler.CallBack<String> callBack) {
        this.callBack = callBack;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what = 3;
                msg.obj = "结果3";
                handler.sendMessage(msg);
            }
        }, 3000);
    }
}

###4、调用

  BaseHandler<Void, Integer> handler1 = new Handler1();
  BaseHandler<Integer, String> handler2 = new Handler2();
  BaseHandler<String, String> handler3 = new Handler3();
  handler1.nextHandler = handler2;
  handler2.nextHandler = handler3;
  handler1.handle();

###5、运行结果
Handler1 开始请求request
Handle1处理请求完成 当前处理结果:1
Handler2 开始请求request
Handle1处理请求完成 当前处理结果:0
Handler3 开始请求request
Handle3处理请求完成 当前处理结果:结果3
重写handleSucess Handler3不再向后传递

##三 要点
####1 Handler只要设置了nextHandler对象,默认向下传递
####2 整个链式请求:链首以handler方法开始,链尾以重写handlerSuccess方法结束
####3 request方法中要调用其参数callBack的onSuccess和onFail方法,注意不是handlerSuccess方法

##四 拓展使用
Android中:一般处理结果我们还可以通过接口使其与Activity耦合,刷新界面
####1接口:

public interface ICheckDzqmyd {
	    void sign();
	    void unSign();
	}
2 Handler
public class CheckOtcDzqmydHandler extends BaseHandler<Void, Void> {

    private ICheckDzqmyd iCheckDzqmyd;

    public CheckOtcDzqmydHandler(ICheckDzqmyd iCheckDzqmyd) {
        this.iCheckDzqmyd = iCheckDzqmyd;
    }

    @Override
    public void handleSuccess(Void lastResult, Void result) {
        iCheckDzqmyd.sign();
    }

    @Override
    public void handleFail(Void lastResult, Void result) {
        iCheckDzqmyd.unSign();
    }

    @Override
    public void request(Void lastResult, final CallBack<Void> callBack) {
		if(具体业务逻辑判断){
			callBack.onSuccess(null);
		}else{
			 callBack.onFail(null);
		}
    }
}
3 Activity实现接口(回调刷新UI)
Activity implements ICheckDzqmyd {
		
	@Override
    public void sign() {
        goBuy();
    }

    @Override
    public void unSign() {
	}
}

这种逻辑在Android中是非常常见的

##五 优点
####1、使用简单,业务逻辑清晰,每个Handler要处理的内容类似;Activity中的判断被抽取出来了

2、接口耦合,拓展性强
3、封装性强,每一个Handler可以复用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值