銀色うつ時間

思い出すたび何か胸につっかえてるだけ

TemplateMethodパターンの雑感

メモ

  • ロジックの手順を定義し、個々のロジックの実装はサブクラスに先送りするパターン
  • コード再利用のための基本的な話
  • 抽象クラスが定義するのは以下
  • フックはクラス内で何もしないか、またはデフォルトの振る舞いを実行する
    • サブクラスで適宜オーバーライドもできる
  • サブクラスがテンプレートメソッドを変更しないようにfinal修飾子を宣言しておく必要がある
  • 「こちらを呼び出さないでください。こちらから呼び出します。」
    • スーパークラスが主導権を持ち、必要に応じてサブクラスを呼び出す(実処理を実行する)ように設計するべき
  • Storategyパターンと混同しがちだが、Storategyパターンはコンポジションを用いてロジックをカプセル化するのに対して、TemplateMethodパターンは継承を用いてロジックをカプセル化する
  • FactoryMethodTemplateMethodの特化型と言えるかもしれない
  • サブクラスがスーパークラスを呼び出すことは許されないのか?
  • スーパークラスが定義する抽象メソッドの数が多すぎると実装が超めんどくさいと思うのだが
    • ロジックの粒度を意識するのが大事。細かくし過ぎると実装は大変になる
    • とはいえ、これは設計の柔軟性とトレードオフな気がする
    • オプションとしてフックが利用できるから、全てを抽象メソッドとせずにオプショナルなロジックはフックにするとよい

実例

  • JavaのArray.sort()など
    • 教科書通りには設計されていないが、「実装をサブクラスに先送りする」という思想が存在する

実装

  • 時間がない