移动架构31_责任链和模板模式封装连续请求
2017-10-31 16:34
363 查看
Demo地址:
https://gitee.com/YuBaoZi/codes/krbjs78p96fa4cnwyqho176
需求分析:通常我们会遇到这样的情况,先去判断一个逻辑(有可能是异步的),当结果为一种情况时,继续执行下一步,再去判断;直到最终,如:
获取用户手机号->获取用户资产信息->购买产品
原理:每一步处理,都有请求、处理通过、处理不通过的逻辑,只是具体的内容不同,用抽象方法;
每个处理封装成一个对象,通过java的对象引用产生关联;
每个处理对象依赖上一个处理的结果,因此要将处理结果传递下去;
移动架构16_模板模式
Handle1处理请求完成 当前处理结果:1
Handler2 开始请求request
Handle1处理请求完成 当前处理结果:0
Handler3 开始请求request
Handle3处理请求完成 当前处理结果:结果3
重写handleSucess Handler3不再向后传递
这种逻辑在Android中是非常常见的
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 开始请求requestHandle1处理请求完成 当前处理结果: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可以复用
相关文章推荐
- 移动架构16_模板模式
- Vue微型架构:requestBody网络请求的模式与自定义协议的封装
- "围观"设计模式(31)--行为型设计模式总结(模板、观察者、策略、状态、责任链、命令、访问者、中介者、备忘录、解释器)
- Jquery微型架构:requestBody网络请求的模式与自定义协议的封装
- 移动架构28_设计模式六大原则六: 开闭原则
- 设计模式之模板方法模式---封装算法。
- 系统架构设计——设计模式之模板模式
- android架构之模板方法模式和策略模式
- 设计模式之模板方法模式(封装算法)
- MVP模式+OKhttp的封装请求数据
- 模式六:命令模式(Command Pattern)——封装请求对象
- 移动架构17_观察者模式
- 模板方法模式(封装算法)
- 移动架构20_策略模式
- 移动架构07_原型模式
- Android 单例模式 封装 Okhttp + RxJava 网络请求(get和post)
- 设计模式之模板方法封装
- Xutils3框架网络请求封装(单例模式)
- 设计模式:算法封装(模板方法,策略)
- 【Android架构】基于MVP模式的Retrofit2+RXjava封装(一)