移动架构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
    评论
全套微服务架构,视频学习java微服务架构,包括如下 第1章 微服务简介 001构建单体应用 002微服务解决复杂问题 003微服务的优点 004微服务的缺点 第2章 Linux使用 005Linux 简介 006Linux 与 Windows 比较 007安装 Linux 008Linux 远程控制管理 009Linux 目录结构 010操作文件目录 011系统管理命令 012开关机命令 013压缩命令 014Linux 编辑器 015修改数据源 016常用 APT 命令 017Linux 用户和组管理 018查看目录和文件的权限 019更改操作权限 020安装 Java 021安装 Tomcat 022安装 MySQL 023部署项目 第3章 Docker实战开发 042设置镜像标签 024Docker 简介 025Docker 功能特点 026Docker 系统架构 027Docker 安装 028第一个 Docker 应用程序 029运行交互式的容器 030后台运行与停止容器 031Docker 客户端帮助命令 032运行 Web 容器 033指定 Web 容器映射端口 034查看容器进程 035查看容器状态 036批量移除容器 037Docker Hub 镜像仓库 038获取镜像 039查找镜像 040更新镜像 041创建和移除镜像 043安装 Tomcat 044安装 MySQL 045部署项目 046数据卷简介 047创建数据卷 048备份数据卷 049恢复数据卷 050Docker Compose-安装 051Docker Compose-使用 第4章 使用 GitLab 托管代码 055GitLab简介 056GitLab 安装 057GitLab 设置 058GitLab 账户管理 059GitLab 使用-HTTP 060GitLab 使用-SSH 第5章 Spring Boot 061Spring简史 062 Spring Boot 简介 063 第一个 Spring Boot 应用程序 064 Spring Boot 自定义 Banner 065 Spring Boot 配置 066 Spring Boot Starter POM 067 Spring Boot 日志配置 第6章 集 MyBatis 068Thymeleaf简介 069 第一个 Thymeleaf 模板页 070 集 Druid 数据源 071 集 TkMyBatis 简化 MyBatis 操作 072 集 PageHelper 分页插件 073 使用 MyBatis Maven Plugin 自动生代码 074 集 MyBatis-测试查询 第7章 项目实战 075项目简介 076 创建依赖管理项目 077 创建通用工具项目 078 创建数据库管理项目 079 创建领域模型项目 080 创建管理后台接口项目 081 创建管理后台实现项目 082 为什么要使用 Dubbo 083 再谈微服务-背景介绍 084 再谈微服务-面向服务架构与微服务架构 085 再谈微服务-服务框架对比 1 085 再谈微服务-服务框架对比 2 086 再谈微服务-RPC 对比 REST 087 Dubbo 简介 088 Dubbo 服务治理 089 Dubbo 组件角色 090 Zookeeper 简介 091 Zookeeper 应用举例 092 Zookeeper 集群模式 093 Dubbo Admin 管理控制台 094 系统后台管理-修改所需依赖 095 服务提供者 096 服务消费者 097 测试 JRebel 热部署 098 登录页 099 首页1 099 首页2 100 使用 thymeleaf 模板 101 使用 iframe 展示功能页 102 频道管理功能-列表页布局 103 新增频道 104 频道列表 105 选择父级频道1 105 选择父级频道2 106 表单页的树控件 107 列表页的树表格 108 FastDFS 分布式文件系统简介 109 FastDFS 分布式文件系统安装 110 文章管理功能-改造树控件1 110文章管理功能-改造树控件2 111 文章管理功能-新增文章 112 文章管理功能-使用 PageHelper 进行分页查询 113 文章管理功能-前端 Datatable 控件分页处理1

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值