背景:在讲到模板模式时候说到钩子方法,不是很理解,做个记录!
彻底搞懂模板模式
抽象方法和空实现方法的区别,当要实例化对象调用的使用时候,抽象方法必须实现,空方法可以不用重写
模板模式是父类提供模板方法,子类提供具体实现,对于子类需要实现的方法,父类写成抽象方法,强制子类实现,对于子类不需要实现的方法,所有子类相同的方法,父类设计为空实现
模板方法中具体方法到底是空实现还是抽象方法本身没有什么区别,只是为了设计优美,让子类只实现自己需要的抽象方法,仅仅设计优美而已
模板模式两要素:父类的模板方法(注意,模板方法一定要放在父类并完全实现,并对子类可见 protected 或者 public)+子类实现具体方法
模板模式可以不需要回调方法和钩子方法
模板模式与回调方法关系:无关,也可以有关,见下面
模板模式与钩子方法关系:无关,也可以有关,见下面
彻底搞懂回调方法
回调方法的定义:通过传递引用来调用引用指定对象的方法,回调方法一定涉及两个类,通过方法参数接收另外一个类的引用来调用另外一个类的方法
回调方法就是一个通过回调对象的引用(java中的引用存的是对象的地址)调用的方法。如果你把回调对象的引用(地址)作参数传递给另一个方法,当这个引用被用来调用其所指向的方法时,我们就说这是回调方法。
回调方法和钩子方法关系:无关,可以有关,见下面
回调方法和模板模式关系:无关(模板模式可以不需要回调方法)也可以有关,比如加上Restaurant类,其方法中回调client的模板方法
彻底搞懂钩子方法
钩子方法的定义:通过一个方法来干涉另一个方法的行为,就是一个方法的返回结果或修改的变量是另一个方法执行时的if判断条件或for/while循环调用条件的
钩子方法和回调用方法的关系:无关,回调方法涉及两个类,钩子方法可以完成只需要一个类,一个类中方法关联,一个类中一个方法的返回结果或修改的变量是另一个方法执行时的if判断条件或for/while循环调用条件的;
也可以有关,就是,当一个类中的方法的判断条件是另外一个类中的方法提供的时候,参数和类变量就要提供另外一个类的引用了,静态方法则不必,所有还是可以有关的。
钩子方法与模板模式的关系:无关,也可以有关,模板模式只是父类提供模板方法,子类实现具体方法(一些方法也可以父类实现)和钩子无关
当某个方法的判断条件需要子类方法提供或父类方法提供的话,就是用到钩子了
其中,最常见的是,父类方法需要子类实现作为判断条件,就是子类控制父类行为,这是模板方法中最常见的情况
钩子方法的模拟和实际
钩子方法是啥
钩子顾名思义就是用来挂东西的。那么要挂东西必须有个被挂的东西,要不就是铁环、要不就是墙的边沿。所以要能挂住东西必须要有个被勾住的铁环,要一个钩子。那么在java中也是同样的原理,你首先需要一个被挂在的东西,一个挂载的东西。
钩子的实现方法
是对于抽象方法或者接口中定义的方法的一个空实现,在实际中的应用,比如说有一个接口,这个接口里有7个方法,而你只想用其中一个方法,那么这时,你可以写一个抽象类实现这个接口,在这个抽象类里将你要用的那个方法设置为abstract,其它方法进行空实现,然后你再继承这个抽象类,就不需要实现其它不用的方法,这就是钩子方法的作用。
抽象父类
public abstract class AbstractClass { public abstract boolean isOpen(); public final void operating() { if(isOpen()) { System.out.println("钩子方法开启"); }else { System.out.println("钩子方法关闭"); } } }
实现类
public class AchieveClass extends AbstractClass { //钩子方法能挂在到operating能干预到operating业务逻辑 @Override public boolean isOpen() { return true; } public static void main(String[] args) { AchieveClass ac = new AchieveClass(); ac.operating(); } }
只要重写isOpen就能干预父类方法的业务流程。相当于将isOpen挂载在了父类的operating()中。