java回调方法、钩子方法以及模板方法模式
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,其处理事件的方法叫做回调方法。(摘自百度百科)
那么通过上面那句话将百度百科中的“回调函数”翻译成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回调方法、钩子方法以及模板方法模式的更多相关文章
- Java中的钩子方法
钩子方法是啥 钩子顾名思义就是用来挂东西的.那么要挂东西必须有个被挂的东西,要不就是铁环.要不就是墙的边沿.所以要能挂住东西必须要有个被勾住的铁环,要一个钩子.那么在java中也是同样的原理,你首先需 ...
- java设计模式(9):模板方法模式(TemplateMethod)
一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 二,类图: 三,通过小例子讲解: 这个模式一般用在 ...
- Java设计模式之(十三)——模板方法模式
1.什么是模板模式? Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. ...
- 设计模式之禅——模板方法模式&钩子方法
** **板方法模式的定义: 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤. 例子:做一个简单的悍马车的模型 见UML图 一个抽象 ...
- Java设计模式学习记录-模板方法模式
前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...
- Java设计模式应用——模板方法模式
所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...
- JAVA设计模式之【模板方法模式】
模板方法模式 提高代码的复用性 把常用的基本方法放入父类中 强调一种流程步骤 角色 抽象类 抽象方法 具体方法 钩子方法 空方法 通过bool控制 具体类 看例子 1.银行模板类 package Te ...
- javascript设计模式——模板方法模式
前面的话 在javascript开发中用到继承的场景其实并不是很多,很多时候喜欢用mix-in的方式给对象扩展属性.但这不代表继承在javascript里没有用武之地,虽然没有真正的类和继承机制,但可 ...
- 设计模式 : Template method 模板方法模式 -- 行为型
设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...
- GOF23设计模式之模板方法模式(template method)
一.模板方法模式概述 模板方法模式是编程中经常使用的模式.它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. (1) ...
随机推荐
- HDU 5273 Dylans loves sequence【 树状数组 】
题意:给出n个数,再给出q个询问,求L到R的逆序对的个数 先自己写的时候,是每次询问都重新插入来求sum(r)-sum(l) 果断T 后来还是看了别人的代码---- 预处理一下,把所有可能的区间的询问 ...
- 优动漫PAINT-百褶裙绘制教程
不论是萌系水手服还是洋气学院风,一定少不了百褶裙的绘制.不同的群褶,会呈现不同的视觉效果.裙褶的结构在舒展和重叠的时候也存在不一样的绘制技巧.让我们一起通过这篇教程,看看百褶裙是如何绘制的吧~ 作者: ...
- TP5防sql注入、防xss攻击
框架默认没有设置任何过滤规则 可以配置文件中设置全局的过滤规则 config.php 配置选项 default_filter 添加以下代码即可 // 默认全局过滤方法 用逗号分隔多个 'default ...
- 2017-2-10 bash基础脚本
练习:写一脚本,实现如下功能: 1.让用户通过键盘输入一个用户名,如果用户不存在就退出: 2.如果其UID等于其GID,就说它是个"good guy" 3.否则,就说它是个“bad ...
- POJ-3348 Cows 计算几何 求凸包 求多边形面积
题目链接:https://cn.vjudge.net/problem/POJ-3348 题意 啊模版题啊 求凸包的面积,除50即可 思路 求凸包的面积,除50即可 提交过程 AC 代码 #includ ...
- 洛谷 P1417 烹调方案 (01背包拓展)
一看到这道题就是01背包 但是我注意到价值和当前的时间有关. 没有想太多,直接写,0分 然后发现输入方式不对-- 改了之后只有25分 我知道wa是因为时间会影响价值,但不知道怎么做. 后来看了题解,发 ...
- 紫书 例题11-8 UVa 11082(网络流最大流)
这道题的建模真的非常的秀, 非常牛逼. 先讲建模过程.源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列 的和减去行数, 然后每一行和列之间连一条弧, 容量为 ...
- 紫书 习题8-10 UVa 1614 (贪心+结论)
这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下. 然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论-- 幸好我没再钻研, 感觉这个结论我肯定是想不到的- ...
- IntelliJ IDEA 进行Maven项目创建build
IntelliJ IDEA 进行Maven项目创建build 1,文件-新建-maven 项目:2,编写pom.xml文件:3,鼠标放到左下,然后选择Maven Projects,然后可以查看项目信息 ...
- 【递推DP】POJ1163The Triangle
题目链接:http://poj.org/problem?id=1163 事实上这个题目有非常多解法,可是我们能够看下这个用一位数组的高效动规解法,这个我上课时老师讲的,非常不错. 先保存最后一行4 5 ...