Java中的鉤子函式
阿新 • • 發佈:2020-12-14
鉤子函式的概念源於模板方法模式(Template Method Pattern)
模板方法的核心概念就是,提供一個演算法的骨架,將一些演算法實現的邏輯,交由子類來完成。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。而鉤子函式在這個模式中,就是在抽象父類裡,提供了一個預設的方法,父類對這個方法有一個預設的實現(也可不實現),子類可以對這個方法進行重寫,從而影響到父類的實現邏輯。
鉤子,顧名思義,就是用來掛東西的,模板方法模式中的抽象父類,就是被掛的、被勾住的,而鉤子函式,就是哪個鉤子,我們可以在鉤子的另一端加東西,也可以不加,也就是可以對鉤子函式進行重寫,或者不重寫。
1、定義抽象客戶類
/**
* 抽象客戶類
*/
public abstract class AbstractClient {
public String name;
public void registration(){
System.out.println(name+"正在掛號");
}
public void queueUp(){
System.out.println(name+"正在排隊");
}
/**
* 具體行為,交由子類實現
*/
public abstract void behavior();
/**
* 評價方法,交由子類實現
*/
public abstract void evaluate();
/**
* 鉤子函式
*/
public void hookMethod(){
System.out.println("鉤子函式,預設實現");
}
public void TemplateMethod(){
registration();
queueUp();
behavior();
evaluate();
hookMethod();
}
}
2、具體實現類,客戶類
public class Client extends AbstractClient {
public Client(String name) {
super(name);
}
@Override
public void behavior() {
System.out.println(name+"正在取錢");
}
@Override
public void evaluate() {
System.out.println(name+"給銀行打出了五星好評");
}
//重寫鉤子函式,實現給銀行工作人員打分
@Override
public void hookMethod() {
System.out.println(name+"給銀行工作人員打了100分");
}
}
3、執行
public class TemplateMethod {
public static void main(String[] args) {
AbstractClient client = new Client("張三");
client.TemplateMethod();
}
}
4、結果
或者,子類也可以通過鉤子函式來控制父類的行為
1、定義抽象父類
public abstract class HookAbstractClass {
//模板方法
public void TemplateMethod() {
if (HookMethod1()) {
SpecificMethod1();
}else{
SpecificMethod2();
}
}
//具體方法
public void SpecificMethod1() {
System.out.println("抽象類中的具體方法1被呼叫...");
}
//具體方法
public void SpecificMethod2() {
System.out.println("抽象類中的具體方法2被呼叫...");
}
//鉤子方法1
public abstract boolean HookMethod1();
}
2、子類
public class AchieveClass extends HookAbstractClass {
@Override
public boolean HookMethod1() {
return true;
}
}
3、結果
public class HookAbstractClassMain {
public static void main(String[] args) {
HookAbstractClass hookAbstractClass = new AchieveClass();
hookAbstractClass.TemplateMethod();
}
}
子類通過重寫HookMethod1()鉤子函式,可以實現控制父類的執行邏輯