テンプレートメソッドパターン
テンプレートメソッドパターン(Template Method Pattern) は、アルゴリズムの構造をスーパークラスで定義し、その具体的な処理をサブクラスに任せるデザインパターンです。このパターンでは、共通の処理の流れを抽象クラスで定義し、個別に異なる処理部分をサブクラスで実装することができます。
このパターンにより、アルゴリズムの基本構造を変更することなく、一部の処理のみを変更することが可能になり、コードの再利用性と柔軟性が向上します。特に、共通の流れの中で一部の処理が異なる場合に有効です。
TypeScriptでのテンプレートメソッドパターンの実装
以下に、TypeScriptでテンプレートメソッドパターンを実装する例を紹介します。この例では、異なる種類のカフェイン飲料(コーヒーと紅茶)の作り方をテンプレートメソッドで実装します。
カフェイン飲料の例
typescript
// 抽象クラス(テンプレートメソッドを定義)
abstract class CaffeineBeverage {
// テンプレートメソッド
prepareRecipe(): void {
this.boilWater();
this.brew();
this.pourInCup();
this.addCondiments();
}
// 共通の手順
boilWater(): void {
console.log('Boiling water');
}
pourInCup(): void {
console.log('Pouring into cup');
}
// サブクラスに実装を任せる抽象メソッド
abstract brew(): void;
abstract addCondiments(): void;
}
// 具体的なサブクラス(コーヒー)
class Coffee extends CaffeineBeverage {
brew(): void {
console.log('Dripping coffee through filter');
}
addCondiments(): void {
console.log('Adding sugar and milk');
}
}
// 具体的なサブクラス(紅茶)
class Tea extends CaffeineBeverage {
brew(): void {
console.log('Steeping the tea');
}
addCondiments(): void {
console.log('Adding lemon');
}
}
// 実際の使用例
const coffee = new Coffee();
console.log('Making coffee...');
coffee.prepareRecipe();
const tea = new Tea();
console.log('\nMaking tea...');
tea.prepareRecipe();
解説
CaffeineBeverageクラス(抽象クラス)
CaffeineBeverage
は抽象クラスで、飲み物を作るためのテンプレートメソッドprepareRecipe
を定義しています。このメソッドは、アルゴリズムの基本的な手順(お湯を沸かす、カップに注ぐなど)を順番に実行します。brew
とaddCondiments
は抽象メソッドとして定義されており、サブクラスで具体的な処理を実装する必要があります。
CoffeeクラスとTeaクラス(具体的なサブクラス)
Coffee
クラスとTea
クラスは、CaffeineBeverage
を継承し、それぞれ異なる方法でbrew
とaddCondiments
の処理を実装しています。- これにより、コーヒーや紅茶の具体的な作り方が異なる部分のみをサブクラスで実装し、共通の流れをスーパークラスで定義しています。
実際の使用例
Coffee
とTea
のインスタンスを作成し、prepareRecipe
メソッドを呼び出すことで、飲み物を作る一連の手順が実行されます。それぞれの飲み物で異なる処理部分のみが異なり、他の部分は共通の手順で進められます。
利点
- コードの再利用性の向上: 共通のアルゴリズムの流れをスーパークラスで定義することで、コードの重複を減らし、再利用性を向上させます。
- 拡張性の向上: サブクラスで具体的な処理を変更することで、新しい種類の飲み物を簡単に追加できます。
- 一貫性の維持: アルゴリズムの流れがスーパークラスで定義されているため、全体の手順の一貫性を保ちながら個別の実装を変更できます。
使用例
- 飲食物の作り方: コーヒー、紅茶、その他の飲料や料理の作り方に共通の手順があり、個別に異なる部分が存在する場合に適しています。
- 文書生成: 複数の形式でレポートを生成する際に、共通の生成手順を抽象クラスに定義し、各形式ごとの具体的な実装をサブクラスに任せる場合に使えます。
- ワークフローの標準化: 特定の処理の流れを標準化し、異なるステップごとに異なる実装が必要な場合にテンプレートメソッドパターンを使うことができます。
まとめ
テンプレートメソッドパターンは、アルゴリズムの基本的な構造をスーパークラスで定義し、その詳細な処理をサブクラスに任せることで、コードの再利用性と柔軟性を向上させるデザインパターンです。TypeScriptでの実装を通じて、共通の流れを定義し、個別の処理をサブクラスで柔軟に実装する方法を理解することができました。
このパターンを利用することで、複数のオブジェクトが共通のプロセスを持ちながら異なる振る舞いを持つ場合に、シンプルで保守性の高いコードを書くことが可能になります。