在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,其处理事件的方法叫做回调方法。(摘自百度百科)

那么通过上面那句话将百度百科中的“回调函数”翻译成JAVA版:回调方法就是一个通过回调对象的引用(java中的引用存的是对象的地址)调用的方法。如果你把

回调对象的引用(地址)作参数传递给另一个方法,当这个引用被用来调用其所指向的方法时,我们就说这是回调方法。回调方法不是由该方法的实现方直接调用,
而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

下面我们来通过一个小需求来实现回调,需求为:王钢蛋去餐厅打饭,餐厅服务员根据其饭量为其打饭。我们先构思下,首先要有个接口,接口中定义个抽象方法为

饭量(回调接口);其次创建王钢蛋(回调类),让王钢蛋实现这个接口,并想好其饭量(回调方法);最后创建餐厅,餐厅服务员(另一方)接待王钢蛋(回调对

象)并根据其提供的饭量(回调方法)打饭(特定事件,该事件会调用回调方法)。上代码:

/**

* 顾客,去食堂吃饭有个前提,要告诉服务员其饭量,才会给你盛饭

* @author coder


*

*/

interface Client{

/**

* 告诉服务员其饭量

* @return

*/

public String appetite();

}

class WangGangDan implements Client{


@Override


public String appetite() {


return "一车米饭";


}


}


/


食堂


/


class Restaurant{


/



* 打饭方法,前提是客户要告知服务员你的饭量,他会根据你的饭量给你“盛”饭


* @param client 排队的客户


* @return


*/


public String dozenRice(Client client){


return "盛了"+client.appetite();


}

}

public class Test1 { //业务处理类,老王去打饭


public static void main(String[] args) {


WangGangDan laowang=new WangGangDan(); //王钢蛋以别名laowang去食堂要饭


Restaurant waiter=new Restaurant();


String dozenRice=waiter.dozenRice(laowang);


System.out.println(dozenRice); //最后老王“盛了一车米饭”


//但是通常我们打饭时不会告诉服务员我们叫什么,这样太麻烦了,那么可不可以只告诉服务员


//饭量多少就给我们打饭呢?按常理来说我们去餐厅也只会要一次饭。


//匿名内部类多用来实现回调,简便


String dozenRice1=waiter.dozenRice(new Client(){


@Override


public String appetite() {


return "一锅米饭";


}});


System.out.println(dozenRice1);


}



}

这里将利用模板方法模式来说明钩子方法是什么,许多设计模式都用到了回调,钩子之类的概念,这些基础点理解了,有些模式也就不那么晦涩难懂了,稍微改写下上面的代码就可以:

/**

* 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步

* 骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情

* 况下,重新定义算法中的某些步骤。

* 【钩子方法】:原理就是实现为空的方法,在某任务之前、之后、

* 执行中、报异常后调用的方法(是不是有种熟悉的感觉)。

* 通常钩子方法是通过抽象类或是本类中的空方法来实现的。

*

*/

abstract class Client{

/**

* 【模板方法】

*/

public void templateMethod(){

before();

appetite();

after();

}

/**

* 【钩子方法】在盛饭前(一个空的实现)

*/

protected void before(){};

/**

* 【抽象方法】告诉服务员其饭量

* @return 饭量

*/

public abstract void appetite();

/**

* 【具体方法】盛饭后

*/

private void after(){

//实际项目这里是共有的业务逻辑

System.out.println("拿筷子,找桌子,开吃...");

}

}

/**

*食堂

*/

class Restaurant{

/**

* 打饭方法,前提是客户要告知服务员你的饭量,他会根据你的饭量给你“盛”饭

* @param client 排队的客户

* @return

*/

public void dozenRice(Client client){

client.templateMethod();

}

}


public class Test1 { //业务处理类,老王去打饭

public static void main(String[] args) {

Restaurant waiter=new Restaurant();

waiter.dozenRice(new Client(){

@Override

protected void before() {

System.out.println("对服务员吹胡子瞪眼!!");

}

@Override

public void appetite() {

System.out.println("盛了一锅米饭");

}});


}

}

java回调方法、钩子方法以及模板方法模式的更多相关文章

  1. Java中的钩子方法

    钩子方法是啥 钩子顾名思义就是用来挂东西的.那么要挂东西必须有个被挂的东西,要不就是铁环.要不就是墙的边沿.所以要能挂住东西必须要有个被勾住的铁环,要一个钩子.那么在java中也是同样的原理,你首先需 ...

  2. java设计模式(9):模板方法模式(TemplateMethod)

    一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 二,类图: 三,通过小例子讲解: 这个模式一般用在 ...

  3. Java设计模式之(十三)——模板方法模式

    1.什么是模板模式? Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. ...

  4. 设计模式之禅——模板方法模式&钩子方法

    ** **板方法模式的定义: 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤. 例子:做一个简单的悍马车的模型 见UML图 一个抽象 ...

  5. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  6. Java设计模式应用——模板方法模式

    所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...

  7. JAVA设计模式之【模板方法模式】

    模板方法模式 提高代码的复用性 把常用的基本方法放入父类中 强调一种流程步骤 角色 抽象类 抽象方法 具体方法 钩子方法 空方法 通过bool控制 具体类 看例子 1.银行模板类 package Te ...

  8. javascript设计模式——模板方法模式

    前面的话 在javascript开发中用到继承的场景其实并不是很多,很多时候喜欢用mix-in的方式给对象扩展属性.但这不代表继承在javascript里没有用武之地,虽然没有真正的类和继承机制,但可 ...

  9. 设计模式 : Template method 模板方法模式 -- 行为型

      设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...

  10. GOF23设计模式之模板方法模式(template method)

    一.模板方法模式概述 模板方法模式是编程中经常使用的模式.它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. (1) ...

随机推荐

  1. Ubuntu 14.04下从源码安装qt4.x

    转自:http://www.cnblogs.com/crazywangzx/p/3505293.html 1.到官网http://qt-project.org/downloads或者ftp://ftp ...

  2. rman参数

    rman 参数 RMAN> show all; 参数是存放在控制文件中的 改参数:(直接改) eg: CONFIGURE RETENTION POLICY TO REDUNDANCY 3 参数: ...

  3. 小型ceph集群的搭建

    了解ceph DFS(distributed file system)分布式存储系统,指文件系统管理的物理存储资源,不一定直接连接在本地节点上,而是通过计算机网络与节点相连,众多类别中,ceph是当下 ...

  4. 快速沃尔什变换(FWT)笔记

    开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C( ...

  5. HDU-5025 Saving Tang Monk 广度搜索 状态压缩

    题目链接:https://cn.vjudge.net/problem/HDU-5025 题意 救唐僧,路上有m(<=9)把钥匙,最多5条蛇和一个唐僧. 目标是前往唐僧的地方,用全部钥匙打开全部的 ...

  6. 教你用webpack搭一个vue脚手架[超详细讲解和注释!]

    1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...

  7. sass05 数据类型,数据运算

    /*! 数字类型 */ $n1: 1.2; $n2: 12; $n3: 14px; p{ font-size: $n3; } /*! 字符串类型*/ $s1: container; $s2: 'con ...

  8. thinkphp5项目--个人博客(四)

    thinkphp5项目--个人博客(四) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...

  9. zzulioj--1775-- 和尚特烦恼1——是不是素数(素数水题)

    1775: 和尚特烦恼1--是不是素数 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 563  Solved: 193 SubmitStatusWeb ...

  10. [NOIP2015模拟10.22] 最小代价 解题报告 (最小生成树)

    Description 给出一幅由n个点m条边构成的无向带权图.其中有些点是黑点,其他点是白点.现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得 ...