在软件的设计/实现过程中,我的同事经常会遇到这样一个场景:需要在一个可重用的、大范围的方法中调用若干个不确定的方法或一系列不确定的操作。在这种情况下,我经常建议他们使用“回调”这种技巧去解决问题。
回调模式和接口、抽象这两个概念是紧密相关的,在这里简要的说明一下。
接口(Interface):说明类该做什么而不指定如何去做。抽象(abstract)的道理也大致如此。
回调,这个模式一般是这么定义的:在回调模式中你可以指定当一个特定时间发生时回调对象上的方法。这句话是不是很不好理解?那么举些例子就清楚了,例:java swing中ActionListener的接口监听机制,类似的API还有java.swing.JOptionPane、java.swing.Timer、java.awt.Tookit……有点明白了吧,简单的说:所谓回调模式,一般就是方法回调——定义个抽象的(先不实现的)方法先行调用,然后在具体的使用中对此抽象方法进行实现,以供前面“回头调用”,此之所谓回调,如是然也。
有个实际的例子,这是在工作中我设计的一个基于回调模式的小工具,它可以根据指定的批量数(batchSize)来处理一个较大的泛型数组(Object[]),这可以用在广域网络计算、Web服务的场景中,因为如果一次让远程网络服务端处理大量的数据,必然会存在效率低下、响应不及的情况,如果分批次处理再传输的话,那样效果就会好的多,响应效率也能让人接受。
package com.tibco.plugin.salesforce.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/** *//**
 * Batch Operation Tool
 *
 * @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public abstract class BatchOperation ...{
/** *//**
     * Sign means no batchSize, all do once.
     */
    public final static int SIGN_NO_BATCH_SIZE = -1;
private final Object[] ALL;
private final int SUM;
/** *//**
     * Call back method, define your operation by imple it.
     *
     * @param params
     * @return
     * @throws Exception
     */
    protected abstract Object[] operate(Object[] params) throws Exception;
/** *//**
     *
     * @param all
     *            all data
     */
    public BatchOperation(Object[] all) ...{
        if (all != null && all.length > 0) ...{
            this.ALL = all;
            this.SUM = all.length;
        } else ...{
            this.ALL = null;
            this.SUM = 0;
        }
    }
/** *//**
     * You can use it to do batch operation.
     *
     * @param batchSize
     *            batch operation size
     * @return operation results
     * @throws Exception
     */
    public Object[] doBatch(int batchSize) throws Exception ...{
        if (SUM == 0)
            return null;
        Object[] results = null;
        if (batchSize == SIGN_NO_BATCH_SIZE) ...{
            // no batch
            results = operate(ALL);
        } else ...{
            // has batch
            final List<Object> LIST_ALL = Collections.unmodifiableList(Arrays
                    .asList(ALL));
            int remain = SUM;
            int times = 0;
            List<Object> resultsList = new ArrayList<Object>(SUM);
            while (remain > 0) ...{
                int theBatch = remain > batchSize ? batchSize : remain;
                Object[] batch = LIST_ALL.subList(batchSize * times,
                        batchSize * times + theBatch).toArray(
                        new Object[theBatch]);
                Collections.addAll(resultsList, operate(batch));
                times++;
                remain = remain - batchSize;
            }
            results = resultsList.toArray(new Object[SUM]);
        }
        return results;
    }
}
如果看了以上的内容还是不明白回调模式或这个工具如何使用,那么我们可以讨论……
 

转载于:https://blog.51cto.com/huqicto/280904

如何利用回调模式去解决问题相关推荐

  1. 利用策略模式结合alibaba/alpha框架优化你的图片上传功能

    图片上传作为一个App经常用到的功能,项目中可以使用各种成熟的框架去完成,但往往实际的情况比想象的复杂.假设我们的上传功能需要满足下面的情况: 支持上传一张图 支持上传多张图 上传多张图时能获取到每张 ...

  2. java 回调模式_总结!!!总结!!!java回调以及future模式

    总是忘记,我这里直接写实际的东西,看其他的博客都是类图,文字描述,这里直接用代码描述. 疑问:什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之 ...

  3. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  4. java企业号回调模式,微信公众平台企业号开发—开启回调模式

    2014年9月17日,微信发布了期待已久的企业号.网上关于企业号的教程几乎还是0,所以这里分享一下的我的开发经验. 对比于订阅号和服务号的开发,企业号的开发显得更加复杂一点.这大概也是腾讯考虑到企业信 ...

  5. 【JUC系列】Future异步回调模式

    何为异步回调 前面只是一个例子,对并发的主要模式进行形象的说明. 下面正式来讲下经常使用的几个和并发相关的概念. 1.2.1. 同步.异步.阻塞.非阻塞 一:同步 所谓同步,就是在发出一个功能调用时, ...

  6. 机房收费系统合作版(三):利用备忘录模式实现取消修改基本数据

    [前言] 鹅思晗小组三个菜鸟成就一个系统,在这个过程中我有幸负责BLL层和外观层的实现.做过机房的朋友都知道,BLL层一个亮点就是设计模式. 至今犹记去年六月份鹅思晗小组成立后,那几天轰轰烈烈的探讨, ...

  7. Android studio中如何利用Debug模式来调试程序

    众所周知,程序猿肯定会遇到的问题就是Bug,即在开发过程中令程序无法运行,或达不到正确需求的程序漏洞或缺陷.    但是Studio是智能的,我们可以利用Debug模式来调试程序,以解决问题.     ...

  8. 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据...

    1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from mu ...

  9. ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?

    ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办? 参考文章: (1)ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办? (2)https: ...

最新文章

  1. 鸿蒙霸榜GitHub,从最初的Plan B到“取代Android”?
  2. React JSX 实例图解
  3. 服务器负载均衡的部署方式
  4. 人工智能取代医生AI画出鼻咽癌放疗靶区,准确性与医生相当
  5. CH - 0502 七夕祭(思维+中位数优化+前缀和优化)
  6. 2018年的AI/ML惊喜及预测19年的走势(一)
  7. 你不知道的javascript读书笔记3
  8. UNIX/Linux系统管理技术手册(1)----脚本和shell
  9. ServHa双机热备简单配置
  10. svn一些基本操作含义
  11. ld: i386 架构于输入文件foo.o 与 i386:x86-64 输出不兼容
  12. 唐宇迪机器学习笔记5:K近邻算法实战
  13. 从PXE启动安装Linux
  14. 使用 Electron 打印到 PDF
  15. VS2017社区版30天到期无法使用,激活方式
  16. 多源信息融合中的一些名词及知识点
  17. vue_elementui拖住滑块拼图验证代码
  18. 跟随郭霖学Volley
  19. pinia 的使用(三)—— actions
  20. 投影向量=投影长度乘以单位向量

热门文章

  1. 1682. [HAOI2014]贴海报
  2. list删除null
  3. TextView实现歌词同步《IT蓝豹》
  4. 谷歌发布GPhone 创始人亲自上阵
  5. sql查询条件为空的另类写法o( ̄▽ ̄)d
  6. 本来连学计算机的都不是,怎么却读了计算机研究生
  7. 通过SCVMM分配SMB 3.0 文件共享
  8. 详解Domino服务器的安装
  9. 微信公众帐号开发教程第13篇-图文消息全攻略
  10. Hibernate复习笔记