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("盛了一锅米饭");
            }});
    }
}

原文地址:https://www.cnblogs.com/jpfss/p/9288568.html

时间: 2024-11-10 14:29:42

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

Java中的钩子方法

钩子方法是啥 钩子顾名思义就是用来挂东西的.那么要挂东西必须有个被挂的东西,要不就是铁环.要不就是墙的边沿.所以要能挂住东西必须要有个被勾住的铁环,要一个钩子.那么在java中也是同样的原理,你首先需要一个被挂在的东西,一个挂载的东西. 钩子的实现方法 是对于抽象方法或者接口中定义的方法的一个空实现,在实际中的应用,比如说有一个接口,这个接口里有7个方法,而你只想用其中一个方法,那么这时,你可以写一个抽象类实现这个接口,在这个抽象类里将你要用的那个方法设置为abstract,其它方法进行空实现,

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

一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 二,类图: 三,通过小例子讲解: 这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用TemplateMethod模式.这样可以保证算法骨架的正确性,又将多态运用的非常好. 这里举个人一天要做的事情吧,假如一个人一天要有起床,吃饭,做事情,睡觉四个事项. 1,首先我们看模板类: [java] 

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

一.模板方法模式概述 模板方法模式是编程中经常使用的模式.它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. (1)核心:   处理某个流程的代码已经都定义好了,但是其中某个节点的代码暂时不能确定,因此,采用模板方法模式,将这个节点的代码转移到子类完成. 即:处理步骤在父类中定义好,具体实现延迟到子类中定义. (2)什么时候采用模板方法模式?   实现一个算法,整体步骤很固定,但是,某些部分需要经常改变,所以把这

(九)模板方法模式

  转载:http://www.cnblogs.com/zuoxiaolong/p/pattern10.html 模板方法模式,这是一个在许多优秀的开源项目中LZ见的最多的一个设计模式,也是LZ觉得最为优秀的一个设计模式,所以这一章LZ会尽自己所能的去尽量将这个设计模式解释清楚. 模板方法模式,一般是为了统一子类的算法实现步骤,所使用的一种手段或者说是方式.它在父类中定义一系列算法的步骤,而将具体的实现都推迟到子类. 最典型的形式就是一个接口,一个抽象父类,父类中会有一系列的抽象方法,而在子类中

JavaScript设计模式与开发实践 模板方法模式

一.模板方法模式的定义和组成 模板方法模式是一种只需使用继承就可以实现的非常简单的模式. 模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序.子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法. 二.第一个例子--Coffee or Tea 我们先来泡一杯咖啡,泡咖啡的步骤通常如下: 把水煮沸 用沸水冲泡咖啡 把咖啡倒进杯子 加糖和牛奶 var Coffee

设计模式(八)the Template method 模板方法模式(类行为型)

1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关. 例子1:银行业务办理流程 在银行办理业务时,一般都包含几个基本固定步骤: 取号排队->办理具体业务->对银行工作人员进行评分. 取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ?

设计模式——模板方法模式

模板方法模式定义:在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 将这个定义进行拆分解释,来建立对于模板方法的一个初步概念.定义中说在一个方法中定义一个算法的骨架,通常我们写的算法都有一个入口函数,在这个入口函数中我们可能需要调用很多其他的方法来完整这个算法(毕竟将所有的代码写在一个大方法里面,从而让一个方法中的代码量达到成百上千行是不提倡的,我们应该让我们的程序更加的模块化,易于管理.),这里的入口函数就是一个算

设计模式 ( 二十 ): Template method模板方法模式 -- 行为型

  1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ? 3.

设计模式(十):模板方法模式

一.概述 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 二.结构类图 三.解决问题 模板方法就是提供一个算法框架,框架里面的步骤有些是父类已经定好的,有些需要子类自己实现.相当于要去办一件事情,行动的流程已经定好了,但有些步骤需要自己去做,而有些步骤可能别人帮我们做了.就拿建网站来说,一般的程序是购买域名-->购买空间-->上传网站-->备案-->审核,每个网站的创建必须经过这样的固定

设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ? 3.解决