やる夫がデザインパターンをやるようです 第14回
テンプレートメソッドのまとめです。
テンプレートメソッドは、処理内でアルゴリズムの骨組みを定義し、いくつかの手順をサブクラスに先送りします。また、アルゴリズムの構造を変えることなくその手順をサブクラスに再定義させます。テンプレートメソッドは上記のような定義で歌われています。骨子となるアルゴリズムはfinal定義され、サブクラスでオーバーライドできないようにして、「変更」に対しては硬直させ、「拡張」するような処理はサブクラスでオーバーライドすることで柔軟に対応できるようになっています。
ストラテジーパターンと比較すると、テンプレートメソッドは、「継承」を使ってアルゴリズムのカプセル化を行い、ストラテジーパターンはコンポジションを使ってカプセル化を行います。コンポジションというのは、オブジェクトで振舞いを構成することを指します。ストラテジーパターンそのものですね。
____ / \ テンプレートメソッドは / ─ ─\ 簡単でわかりやすかったお。 / (●) (●) \ | (__人__) | / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ / ___ / ⌒ ⌒\ 気に食わないメソッドを継承して / (●) (●) \ オーバーライドしておいらの実力を / ///(__人__)/// \ 見せ付けてやるお | u. `Y⌒y'´ | \ ゙ー ′ ,/ /⌒ヽ ー‐ ィヽ / rー'ゝ 〆ヽ /,ノヾ ,> ヾ_ノ,| | ヽ〆 |´ | / ̄ ̄\ (どっからそんな発想が湧いてくんだ) / _ノ \ てめぇにもとっとと後輩つけて | ( ●)(●) まるっとオーバーライドしてもらいてぇもんだな . | (__人__) | ` ⌒´ノ . | } . ヽ } ヽ ノ / く | \ | |ヽ、二⌒) ____ / \ / ─ ─ \ いや、普通にそれはないわ / (●) (●) \ | (__人__) | \ ` ⌒´ ,/ r、 r、/ ヘ ヽヾ 三 |:l1 ヽ \>ヽ/ |` } | | ヘ lノ `'ソ | | /´ / |. | \. ィ | | | | | / ̄ ̄\ / _ノ \ いや、どこもない話じゃないんだが、 | ( ●)(●) てめぇに自信を持つのはかまわん。 . | (__人__) そんなスーパーハカーのやる夫に聞くが | ` ⌒´ノ 今回のテンプレートメソッド。こいつをみたのは . | } 初めてじゃないはずだ。 . ヽ } ヽ ノ / く | \ | |ヽ、二⌒) ____ / ⌒ ⌒ \ そうだお。スーパーハカーだから ./( ―) ( ●) \ 初めてじゃないお。 /::⌒(_人_)⌒::::: | | ー .| \ / / ̄ ̄\ / _ノ \ そうだな。じゃぁ | ( ●)(●) どこでこいつを見たか話してみろ . | (__人__) | ` ⌒´ノ . | } . ヽ } ヽ ノ / く | \ | |ヽ、二⌒) ____ / ノ \\ そんなプライベートなことまで / (●) (●)\ 問いただされるのは / ∪ (__人__) \ さすがの俺もひくわ | ` ⌒´ | \ /⌒)⌒)⌒) //⌒)⌒)⌒) ノ | / / / (⌒) / / / / /´ | :::::::::::(⌒) ゝ :::::::::::/ | l | ノ / ) / ヽ ヽ_ヽ /' / / ヽ __ / / / ____ / ̄ ̄\ ( ;;;;( (このキュンポは / _ノ ヽ\ ) ;;;;) いったいどういう勘違いしてやがんだ?) | ( ○) (○)/;;/ いやいや。 . | (__人__) l;;, おめぇの性癖を語れとはいってねぇんだが? | ∩ ノ)━・'/ . | / ノ´ } . ヽ / / } ヽ/ / ノ ノ L____ ⌒ \ / \ そんなこと言っても / (○) (○)\ ブラウザの履歴は見せられないお!! / (__人__) \ | |::::::| | \ l;;;;;;l /l!| ! / `ー' \ |i / ヽ !l ヽi ( 丶- 、 しE |そ ドンッ!! `ー、_ノ ∑ l、E ノ < レY^V^ヽl / ̄ ̄\ / \ (あーこいつの勘違いは神憑ってるわ) |:::::: | もういい。俺が悪かった。 . |::::::::::: | |:::::::::::::: | ....,:::´, . . |:::::::::::::: } ....:::,, .. . ヽ:::::::::::::: } ,):::::::ノ . ヽ:::::::::: ノ (:::::ソ: . /:::::::::::: く ,ふ´.. -―――――|:::::::::::::::: \ -―,――ノ::ノ―― |:::::::::::::::|ヽ、二⌒)━~~'´ ノ L____ ⌒ \ / \ / (○) (○)\ googleの検索履歴も見せられないお!! / (__人__) \ | |::::::| | \ l;;;;;;l /l!| ! / `ー' \ |i / ヽ !l ヽi ( 丶- 、 しE |そ ドンッ!! `ー、_ノ ∑ l、E ノ < レY^V^ヽl
// ゲーム製作会社スーパークラス
abstract class GameCompany {
public Game orderGame( String name ){
// サブクラスに作成するゲームを決定させる
Game gameInst = createGame( name );
gameInst.prepare();
gameInst.produce();
gameInst.checkProduct();
gameInst.package();
return gameInst;
}
// ファクトリオブジェクトから受け取ったcreateGameメソッド
abstract Game createGame( String name );
}
createGameメソッドはサブクラスで生成処理を拡張しています。orderGameはfinal指定されていませんが、この手順のアルゴリズムを変えることはありませんので処理がカプセル化されていますね。と、このようにテンプレートメソッドはいろいろなシーンで出て来ると思います。継承を使った拡張なのでオブジェクト指向を学び始める方にも分かりやすい内容ではないでしょうか。
≪第13回・第15回≫




