钩子方法源于设计模式中模板方法(Template Method)模式,模板方法模式的概念为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。其主要分为两大类:模版方法和基本方法,而基本方法又分为:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method)。

四种方法的基本定义(前提:在抽象类中定义):

(1)抽象方法:由抽象类声明,由具体子类实现,并以abstract关键字进行标识。

(2)具体方法:由抽象类声明并且实现,子类并不实现或者做覆盖操作。其实质就是普遍适用的方法,不需要子类来实现。

(3)钩子方法:由抽象类声明并且实现,子类也可以选择加以扩展。通常抽象类会给出一个空的钩子方法,也就是没有实现的扩展。它和具体方法在代码上没有区别,不过是一种意识的区别;而它和抽象方法有时候也是没有区别的,就是在子类都需要将其实现的时候。而不同的是抽象方法必须实现,而钩子方法可以不识闲。也就是说钩子方法为你在实现某一个抽象类的时候提供了可选项,相当于预先提供了一个默认配置。

(4)模板方法:定义了一个方法,其中定义了整个逻辑的基本骨架。

代码如下:

/**

* 抽象类,定义模板方法和基本方法

*/

abstract class abstractClass{

/**

* 具体方法,声明并实现,继承此抽象类不需实现此方法

*/

public void concreteMethod(){

System.out.print("这是一个具体方法");

}

/**

* 抽象方法,abstract关键字标识,只声明,并不实现,继承此抽象类必须实现此方法

*/

protected abstract void abstractMethod();

/**

* 钩子方法,声明并实现(空实现或者定义相关内容皆可),继承此抽象类的子类可扩展实现或者不实现

*/

public void hookMethod(){

//可定义一个默认操作,或者为空

//System.out.print("此钩子方法有个默认操作")

};

/**

* 模板方法,整个算法的骨架

*/

public void templateMethod(){

abstractMethod();

concreteMethod();

hookMethod();

}

}

public class childClass2 {

public void bond(abstractClass abstractClass){

abstractClass.templateMethod();

}

}

public class Test{

public static void main(String[] args) {

childClass2 childClass2=new childClass2();

childClass2.bond(new abstractClass(){//匿名内部类实现回调

@Override

protected void abstractMethod(){

System.out.print("子类实现父类抽象类中的抽象方法");

}

/**

* 重构钩子方法

*/

//public void hookMethod(){

System.out.print("子类可以在父类钩子方法实现的基础上进行扩展");

}

}

}

原文:https://www.cnblogs.com/alice-cj/p/10252883.html

java 钩子方法_java中钩子方法的概念相关推荐

  1. java 钩子_java中钩子方法的概念

    钩子方法源于设计模式中模板方法(Template Method)模式,模板方法模式的概念为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新 ...

  2. java动态方法_Java 动态方法调用

    Java 动态方法调用 在Java中,如果方法重写只是一种名字空间的编写,那么它最多是让人感到有趣,但没有实际价值,但情况并非如此.方法重写构造成了Java最大的一个概念基础:动态方法调度(dynam ...

  3. java arraycopy()方法_Java学习之System.arraycopy()方法

    java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少.System提供 ...

  4. java clone方法_Java Calendar clone()方法与示例

    java clone方法 日历类clone()方法 (Calendar Class clone() method) clone() method is available in java.util p ...

  5. java void方法_Java对象类的最终void wait(long ms)方法,包含示例

    java void方法 对象类最终无效等待(长毫秒) (Object Class final void wait(long ms)) This method is available in java. ...

  6. java tostring方法_Java虚拟机如执行方法调用的(二)?

    虚方法调用 Java里所有非私有实例方法调用都会被编译成invokevirtual指令. 接口方法调用都会被编译成invokeinterface指令.这两种指令都属于Java虚方法的调用. 在大多数情 ...

  7. java peek方法_Java ArrayDeque peek()方法与示例

    java peek方法 ArrayDeque类peek()方法 (ArrayDeque Class peek() method) peek() Method is available in java. ...

  8. java double方法_Java Double类compare()方法与示例

    java double方法 双类compare()方法 (Double class compare() method) compare() method is available in java.la ...

  9. java 析构方法_java析构方法详解

    之前给大家介绍了一下java构造方法,那么下面要给大家讲到的就是java析构方法,下面一起通过文章来了解一下吧. 析构方法和构造方法不同,真好是相反的,在对象脱离其作用域的时候,系统自动执行析构方法. ...

最新文章

  1. 码农也来玩奥运开幕式“超级变变变”!相机动捕,实时转换赛事图标,项目开源可试玩...
  2. Android中全屏或者取消标题栏
  3. python主函数入口_Python 入口函数(菜鸟入门)
  4. 【Python】Python中str()和repr()函数的区别
  5. mysql数据库教程全解_MySQL数据库基础教程详解
  6. Android 应用开发(9)---内联复杂的XML资源
  7. Css学习总结(1)——20个很有用的CSS技巧
  8. Python数据分析四剑客:IPython、Numpy、pandas、Matplotlib
  9. linux时间相关结构体和函数整理
  10. P2000 拯救世界(生成函数裸题+NTT高精)
  11. ZenTao不支持Win8.1问题解决
  12. 网络地址转换——NAT
  13. python网络编程内容_图解Python网络编程
  14. 马后炮之12306抢票工具(二) -- 联系人获取车次
  15. linux 使用设备树点亮LED 实战
  16. 大数据----数据仓库设计基础(实列演示)
  17. IPv6 路由信息查看命令
  18. 数据分析方法:结构分析法
  19. DevOps实战:版本管理实践指南
  20. web前端面试题(面试题大全)

热门文章

  1. 【自撰】Linux搭建Redis数据库
  2. python大神的成长之路普通话三分钟_我的成长之路普通话考试说话三分钟范文
  3. python的excel教程_Python对Excel(*.xls)的操作
  4. vue中sync的使用
  5. 记录第一次做炸鸡和炸薯条
  6. cm10主题android l,G12 CM10.1透明,风V4音效农历短信弹出 来电显示各类特效,漂亮主题...
  7. 小白必看——台式机选购指南
  8. 2018苹果开发者账户忘记密保问题,导致协议无法更新解决方法(脱坑呀)
  9. Spring的学习记录
  10. uni-app实战之社区交友APP(7)消息页开发