知识卡片

钩子方法让子类返回值控制父类执行分支

普通读书笔记卡 · 1985.a.4

内容

当喇叭是否响需要按客户意愿变化时,仅有[[模板方法模式的两类方法]]中的基本方法不够—— 因为alarm()是否被调用本身要变化。解法是新增有默认实现的isAlarm()方法,模板方法根据其 返回值决定是否执行某步骤,这种”由子类返回值决定父类执行路径”的方法称为钩子方法。发散: 钩子方法比基本方法更彻底——基本方法影响”怎么做”,钩子方法影响”要不要做”。

参考来源

- 位置:《设计模式之禅(第2版)》第10章《模板方法模式》(源文件:_epub-src/text/part0045.html) - 结论依据:原文给出isAlarm()方法的默认实现(返回true)、H1覆写为可配置字段、H2覆写为固定false,模板方法run()内用if(this.isAlarm())决定是否调用alarm(),并明确命名"该方法就叫做钩子方法(Hook Method)"。 - 原始内容:在抽象类中,isAlarm是一个实现方法。其作用是模板方法根据其返回值决定是否要响喇叭,子类可以覆写该返回值……由子类的一个方法返回值决定公共部分的执行结果,是不是很有吸引力呀!