Hook

hook.png
hook2.png

概要

親クラスに、存在する、オーバーライドしてもしなくてもどっちでもいい関数のこと
デフォルトではだいたい、どうでもいい挙動を行う

abstract class Parent{
    void hook(){}//オーバーライドしてもいいし、しなくてもいい
}

どんな時にhookを使うの?

  • サブクラスがアルゴリズムのオプション部分を実装したい場合

package template_method;
 
public abstract class CaffeineBeverage {
    //サブクラスに上書きされたくないのでfinal修飾子を「つける
    public final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        if(customerWantsCondiments()){
            addCondiments();
        }
    }
    public boolean customerWantsCondiments() {
        return true;
    }
    abstract void brew();
    abstract void addCondiments();
    void boilWater(){
        System.out.println("お湯を沸かします");
    }
    void pourInCup(){
        System.out.println("カップに注ぎます");
    }
 
}
Cofee.java Tea.java
package template_method;
 
import java.io.IOException;
 
public class Coffee  extends CaffeineBeverage{
 
    public void brew(){
        System.out.println("フィルタでコーヒーをドリップします");
    }
    public void addCondiments(){
        System.out.println("砂糖とミルクを追加します");
    }
 
    @Override
    public  boolean customerWantsCondiments(){
        System.out.println("コーヒーに砂糖とミルクを入れますか?y/n");
        int answer;
        try {
            answer = System.in.read();
            if(answer=='y'){
                return true;
            }
        } catch (IOException e) {
            System.out.println("失敗でーす");
            e.printStackTrace();
        }  //   キー入力を c に代入
        return false;
    }
 
}
package template_method;
 
import java.io.IOException;
 
public class Tea extends CaffeineBeverage{
    public void brew(){
        System.out.println("紅茶を浸します");
    }
    public void addCondiments(){
        System.out.println("レモンを追加します");
    }
    @Override
    public  boolean customerWantsCondiments(){
        System.out.println("レモンを追加しますか?y/n");
        int answer;
        try {
            answer = System.in.read();
            if(answer=='y'){
                return true;
            }
        } catch (IOException e) {
            System.out.println("失敗でーす");
            e.printStackTrace();
        }  //   キー入力を c に代入
        return false;
    }
}

英語でのhookの意味

a(引っかけるため先の曲がった)鉤(かぎ).
b留め金,ホック.
用例
hooks and eyes (服の)ホックと留め穴.
c掛けかぎ,自在かぎ.
用例
a hat hook 帽子掛け.
d(公衆電話の受話器をかける)手(の部分).
2a(魚釣り用の)かぎ針.
用例
a hook and line 釣り糸をつけた釣り針.
bわな.
3[通例複合語をなして] かぎ形の刈り取りがま.
用例
⇒billhook.
4a(引用符の)かぎ 《‘ '》.
b(音符の)フック,かぎ 《♪などの旗形の部分》.
5a(河川の)屈曲部.
b海に突き出た陸地[岬,砂州(など)].
6【ボクシング】 フック 《ひじを曲げて打つ打ち方》.
7(ゴルフ・野球などで)フック 《ボールが途中から利き腕と逆方向に曲がること; cf. slice》.
8[複数形で] 《俗語》 指; 手.
などいっぱいありますね

参考にした本


template-method

サポートサイト Wikidot.com template-method