`
huqi
  • 浏览: 96996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

如何利用回调模式去解决问题

阅读更多

在软件的设计/实现过程中,我的同事经常会遇到这样一个场景:需要在一个可重用的、大范围的方法中调用若干个不确定的方法或一系列不确定的操作。在这种情况下,我经常建议他们使用“回调”这种技巧去解决问题。

回调模式和接口、抽象这两个概念是紧密相关的,在这里简要的说明一下。

接口(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="mailto: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;
    }

}

如果看了以上的内容还是不明白回调模式或这个工具如何使用,那么我们可以讨论……



分享到:
评论

相关推荐

    模版模式和回调模式

    模版模式和回调模式是软件设计模式中的两种重要策略,它们在不同的场景下能有效解决代码复用和异步处理的问题。本文将深入探讨这两种模式的原理、应用场景以及它们之间的区别。 **模版模式(Template Method ...

    java 回调函数 实现

    在Java编程中,回调函数是一种设计模式,它允许一个对象在另一个对象执行特定操作后接收通知或进行处理。这种机制通常用于事件驱动编程或者异步编程中,使得代码能够响应某些特定事件的发生。在给定的场景中,我们...

    微信支付-商户支付模式一url接口回调-java版

    在这个Java版的实现中,我们将探讨如何利用URL接口回调来处理支付流程。 首先,我们需要理解URL接口回调的基本概念。在微信支付中,当用户完成支付后,微信服务器会主动向商家设定的回调URL发送一个POST请求,携带...

    微信企业号回调模式demo,在各网络版本基础上调试修改成功

    回调模式是微信企业号中的一个重要概念,它允许应用在接收到微信服务器的事件推送时进行相应的处理。以下是对这个"微信企业号回调模式demo"的详细解析。 1. **回调模式**: 微信企业号回调模式是基于HTTP的POST...

    微信企业号回调模式设置图解(PHP版).docx

    本文将详细介绍如何设置微信企业号的回调模式,并解决其中常见的echosstr校验错误问题。 #### 二、准备工作 在开始设置之前,请确保已经完成以下准备工作: 1. **拥有一个微信企业号**:需要先申请并获得一个微信...

    websocket 实现实时推送的例子(工厂模式,回调机制)

    在这个"WebSocket 实现实时推送的例子(工厂模式,回调机制)"中,我们将深入探讨如何利用WebSocket来构建一个实时推送系统,并结合工厂模式和回调机制来增强其灵活性和可维护性。 首先,让我们了解一下**工厂模式*...

    osg回调函数的使用

    OSG还支持观察者模式,例如通过`osg::StateSet`的`addUpdateCallback()`方法,可以添加一个更新回调,每当状态集需要更新时,这个回调函数会被调用。 ```cpp class MyUpdateCallback : public osg::StateSet::...

    C#调用C++动态库中自身定义的回调函数

    回调函数是一种设计模式,允许将一个函数的地址作为参数传递给另一个函数。在C++中,这通常是通过函数指针实现的。当C++库执行到需要调用用户提供的函数时,它会使用这个指针来调用C#中预先注册的回调方法。 在VS...

    回调函数应用.rar

    回调函数在IT行业中是至关重要的一个概念,尤其是在...无论是初学者还是经验丰富的开发者,都需要熟练运用回调函数来解决实际问题。通过深入学习和实践,我们可以更好地利用回调函数来构建高效、可扩展的软件系统。

    手动回调函数

    回调函数在计算机编程中是一种设计模式,它允许你将一个函数...回调函数在解决异步问题、实现事件驱动编程和构建模块化系统等方面都发挥着重要作用。理解并熟练掌握回调函数的使用,对于提升VB编程能力具有重要意义。

    回调函数demo

    回调函数是编程中的一种常见设计模式,特别是在异步编程中,它允许我们将一个函数作为参数传递给另一个函数,以便在特定事件发生或操作完成后执行。这个概念在JavaScript、Python、C++等许多编程语言中都有广泛应用...

    回调函数讲解

    ### 回调函数详解 #### 一、回调函数的基本概念 在计算机编程中,回调函数是一种特殊的函数,它被作为参数...通过理解和掌握回调函数的工作原理及其应用场景,开发者可以更高效地解决问题并构建出高质量的软件产品。

    易语言汇编实现子程序回调应用源码

    在编程中,回调是一种设计模式,允许将一个函数或方法作为参数传递给另一个函数,然后在特定时间被调用。这种机制使得代码具有更好的灵活性和可扩展性。在易语言中,回调通常用于事件驱动编程,比如窗口消息处理、...

    回调函数演示

    理解和掌握回调函数的工作原理,对于提升编程技巧和解决实际问题具有重要意义。在VC++环境中,熟悉Windows API的回调机制更是不可或缺的技能。通过实践和学习,你将能够自如地运用回调函数,创造出更加灵活和高效的...

    Java中的回调使用

    为了解决这个问题,Java社区发展出了诸如RxJava这样的库,它们提供了一种更优雅的方式来处理回调和异步编程,通过链式调用和操作符重载来组合异步操作。 总的来说,回调是Java中实现异步处理和事件响应的一种常见...

    Java基础核心理解+什么是回调即回调机制讲解

    - 在回调模式中,被调用方在完成任务后会反过来调用调用方预先定义好的方法。 - 这种双向调用机制使得系统可以在处理耗时任务的同时保持其他部分的运行不受影响。 #### 二、回调机制的原理与实现 为了更好地理解...

    易语言类回调新

    而“类回调新”很可能代表了易语言在类操作上的新方法,它可能是为了解决传统类回调机制中存在的某些局限性而提出的改进方案。 回调函数是编程中另一个重要概念,它通常用于实现事件驱动的编程模式。在易语言中,回...

    个人免签监测APP支付宝转账微信模式监听回调源码

    针对由于老旧版本app的各种性能及BUG问题,目前老旧版本的短信监测回调APP版本存在几个通病。1、对于手机性能,网络方面要求高,并发失败。2、app 内存泄露,卡死,掉线问题导致的失败。3、非app扫码付款,导致备注...

    VC++ 回调函数使用实例

    在VC++编程中,回调函数是一种非常重要的设计模式,它允许我们传递一个函数作为参数给另一个函数,使得被调用的函数可以在适当的时机调用...通过实践这些示例,你将能更熟练地在VC++项目中运用回调函数,解决实际问题。

    C++ 回调函数

    为了解决这些问题,现代C++引入了更多的语言特性,如lambda表达式和std::function,使得回调功能更加强大和易用。 在实际项目中,回调函数常常用于处理异步操作的结果。例如,在网络编程中,当一个请求完成时,我们...

Global site tag (gtag.js) - Google Analytics