1. 程式人生 > 其它 >Java中的鉤子函式

Java中的鉤子函式

鉤子函式的概念源於模板方法模式(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()鉤子函式,可以實現控制父類的執行邏輯