やる夫がデザインパターンをやるようです 第12回

やる夫がデザインパターンをやるようです 第12回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第12回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第12回をGoogle Bookmarksに追加

   これまでお前に教えたデザインパターンは
   ・ストラテジーパターン
   ・デコレータパターン
   ・シンプルファクトリ
   ・ファクトリメソッド
   ・アブストラクトファクトリ
   ・シングルトンパターン
   と、もう6つになるな。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
   そうだお。もう6つもおぼえたお。
   飲み込みが早い新人で会社も救われてるお
   つぎのパターンを早くよこせお。
           ____
        /⌒  ⌒\
.      /( ●)  (●)\ 
     / ::::::⌒(__人__)⌒::::: \ 
    |      |r┬-|     |  
     \       `ー'´     /
    ノ            \
  /´               ヽ                 カ
 |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
     ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
  ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
  次に覚えるパターンはテンプレートメソッドというパターンだ。
  テンプレートってのはどういう意味だかわかるか?
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
  2chでスレッド立てるときに、前のスレ立て人が書き込んだ注意とか
  リンクとかいろいろ継承して使うあの「テンプレ」のことかお?
      ____
    /_ノ   ヽ_\
   /( ●) ( ●)\
 / ::::::⌒(__人__)⌒:::::\
 |        ̄      |
 \              /
  まぁそのとおりだ。
  テンプレートといえば、雛形とか定型書式とかそういうものだ。
  「テンプレートメソッド」といえばメソッドがテンプレート化されている
  ということを想像するだろう。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
   ソウゾウシマスネー
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ
   (もう説明に飽き始めやがったな)
   今回のパターンはもう既にこれまでに何度も出てきている。
   単純に処理をテンプレート化したい場合、お前ならどうする?
   / ̄ ̄\  ( ;;;;(
 / _ノ  ヽ\ ) ;;;;)
 |  ( ●) (●)/;;/  
. |   (__人__) l;;,   
  |    ∩ ノ)━・'/  
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ
   ソウゾウシマスネー
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ
   ・・・やる夫。ハナシは進んでるぞ。
   / ̄ ̄\  ( ;;;;(
 / _ノ  ヽ\ ) ;;;;)
 |  ( ○) (○)/;;/  
. |   (__人__) l;;,   
  |    ∩ ノ)━・'/  
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ
   ソウゾウシマスネー
       ____
     /⌒  ⌒\
   /( ―)  (―)\
  /::::::⌒(__人__)⌒::::: \
  |              |
  \               /
        / ̄ ̄\
      /       \   てめぇの端末だけ外見れねぇように
      |::::::        | ネットワークチームに申請するか。。。
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
           ___   ごめんなさいごめんなさい
     ____,./      \   ごめんなさいごめんなさい
    ノ   /         \  ごめんなさいごめんなさい
  /   /            \ ごめんなさいごめんなさい
 |     |::..           ...::::|
 ヽ    `一ー――――-、;;;;::/`一ー―-、
  ヽ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
   てか、メソッドのテンプレート化なんて、
   デザインパターンというか普通に実装してりゃ
   いくらでも出てくるお。
         ____
       /      \
      /  ─    ─\
    /    (●)  (●) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |
class YaruoTemplate{
final void prepareJob(){
openBrowser();
surf2ch();
surfAkibaBlog();
closeBrowser();
}
abstract void surf2ch();
}
class MyJob extends YaruoTemplate{
void surf2ch(){
System.out.println( "VIPを保守するお" );
}
}
     ____
    / ⌒  ⌒  \  これでどうかお?
  ./( ―) ( ●)  \
  /::⌒(_人_)⌒:::::  |
  |    ー       .|
  \          /
  まぁそういうことだ。prepareJobという
  仕事の準備メソッドをテンプレート化してるんだな?
  実処理はサブクラスに先送りさせているということか。
  (仕事の準備にVIPの保守すんのかてめぇは)
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
   こんなん楽勝すぎて話しになんないお。
   テンプレートメソッド(笑)だお。
          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
   まず、
surf2ch();
surfAkibaBlog();
   はてめぇの程度の低い釣りだとして、
checkInternet();
   に変更する。そうすれば、prepareJobは
   ・ブラウザを開く
   ・ネットを調べる
   ・ブラウザを閉じる
   という処理がテンプレート化されたものと定義されるわけだ。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
surf2ch();
surfAkibaBlog();
   はおいらの大事な大事な仕事の準備だお!
       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\
  /    (__人__)   \
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /
   話が進まんから相手にしないが、
   基本的にはこのprepareJobをfinal指定し
   サブクラスで処理を決定する。
   テンプレートメソッドとして、これはこれで正しい。
   では、そのsurf2ch();とsurfAkibaBlog();は
   必要なときにはいつでも処理の中にサブクラスを
   フックできるようにアルゴリズムをカプセル化してみろ
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
         |
     \  __  /
     _ (m) _
        |ミ|
      /  `´  \
       ____
     /⌒  ⌒\   日本語でおk
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |
  \      `ー'´     /
   (その頭に浮かんだ電球みたいのはなんなんだ)
   お前は多分、
checkInternet();
   をサブクラスでオーバーライドして
surf2ch();
surfAkibaBlog();
   の処理をしようとするだろう。
   だが、そのsurf2ch();とsurfAkibaBlog();は
   restJob();(息抜き)という処理だ。
   checkInternet();ではやらずにフックして処理しろ
   といっている。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\
. |   (__ノ ̄  |
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |
           ___   ━┓
         / ―  \  ┏┛
        /  (●)  \ヽ ・
       /   (⌒  (●) /
       /      ̄ヽ__) /
.    /´     ___/
    |        \
    |        |
今回のパターンはテンプレートメソッドです。このパターンは、それ自体を知らない技術者も知らず知らずの内に適用してたりしますが、あわせてフックというものも学んで生きたいと思います。
次の回では、まずフックとはなにか。と、その使い方、使い分けについて記述したいと思います。

≪第11回
第13回≫

コメントをどうぞ