____
/ \ なんだってアーキテクトとか
/ _ノ ヽ_\ エラそうな肩書き持ってるやつは
/ (ー) (ー)\ 出し惜しみばっかするんだお
| (__人__) |
/ ∩ ノ) /
( \ / _ノ´.| | \ -、
.\ " /__| | (__丿
\ /___
/ ̄ ̄\
/ _ノ \ (まーだごちゃごちゃいってやがる)
| ( ●)(●) おめぇが俺の足をひっぱらねぇように
. | (__人__) 今から調教してやってんだろが
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
おいらが足のおまいをひっぱって
ひっぱるのはおいらがおまいのひっぱりを
あしだお!!!!!
γ ⌒⌒ヽ
/ ̄ ̄\ ( ( ヽ ) ノ
/_ノ \ (⌒) 三 ノ 从 ゝ
( ●)( ●) ヽ 三/ | ニ ____ (⌒)
. | (__人__) u } | | /\ / ) し / | ミ
| ` ⌒´ ノ ! 、 /(○ )::(○ )⌒\/ | ミ
. | } \./:::::::(_人_):::::::: i' |
. ヽ } | )ww) | |
ヽ ノ ヘ \ `ー" ノ
/ く 、_/っ/ \ . . \
| \--一'' \
| |ヽ、二⌒)、 \
わかったわかった
____ (よくわかったな)
/ ― ―\ わかればいいお
/ (●) (●)\
/ (__人__) \
| ` ⌒´ |
\ /
/ \
____
/_ノ ヽ_\ とりあえずフックて何だか説明してほしいお
/(●) (●)\
/ (__人__) \
| ( ( |
\ `ー' /
ノ \
class YaruoTemplate{
final void prepareJob(){
openBrowser();
checkInternet();
if( isRest() ){
restJob();
}
closeBrowser();
}
abstract void restJob();
boolean isRest(){
return false;
}
}
簡単に説明すると、このisRest()メソッドをフックという。
こいつをサブクラスでオーバーライドして
仕事を休憩する(restJob())かどうか決めるんだ。
これでテンプレート化されているアルゴリズムをサブクラスが条件付で制御できるだろう。
restJob()の実装でvipを保守しようが、ニュー速+に張り付いてようが構わんが、
休憩なんてとってられる状態ではない場合に、
isRest()フックで、サブクラスがfalseを返す実装にすればいい。
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
class MyJob extends YaruoTemplate{
void restJob(){
System.out.println( "VIPを保守するお" );
System.out.println( "ニュー速+にはりつくお" );
}
boolean isRest(){
// 絶対trueを返す
return true;
}
}
____
/⌒ ⌒\
. /( ●) (●)\ こうかお?
/ ::::::⌒(__人__)⌒::::: \
| |r┬-| |
\ `ー'´ /
ノ \
/´ ヽ カ
| l l||l 从人 l||l l||l 从人 l||l カ タ
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. タ
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
/ ̄ ̄\ ・・・やると思ったが、
/ _ノ \ isRest()の実装がキモなんだが。
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
boolean isRest(){
String ans = null;
System.out.println( "休憩を取りますか?(y/n)")
BufferedReader in = BufferedReader( new InputStreamReader( System.in ) );
try{
ans = in.readLine();
}
catch( IOException e ){}
if( ans == null ){
return false;
}
else if( ans.toLowerCase().startsWith("y")){
return true;
}
return false;
}
/ ̄ ̄\ これでフックが効果を発揮するだろう。
/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
____
/_ノ ヽ_\
/(●) (●)\
/ (__人__) \ えー・・・そうかなぁ
| ( ( |
\ `ー' /
ノ \
/ ̄ ̄\ (こいつだんだんタメ口になってきやがってるな)
/ _ノ \ まぁ、フックがわかればいい。
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
フックは必ずしもテンプレートメソッドに適用されるものではありませんが、フックを使って抽象クラスのアルゴリズムのフローを条件付で制御できるので非常に便利です。
そしてフックはサブクラスで必ずしも実装しなくてもよいので、アルゴリズムの「オプション部分を実装する
方法」を提供出来ます
≪第12回・
第14回≫