Index
参考にした本では以下のように説明されています。
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンをTemplateMethodパターンとよぶ
- ロジックを共通化できる
- スーパークラスで宣言されている抽象メソッドをしっかり理解する必要がある
- サブクラスをスーパクラスを同一視することができる
メリットについてはサンプルコードを見た後に改めて振り返って見ましょう
クラス図はこんな感じ
このクラスで処理の枠組みを定義しています。
サブクラスで実際の挙動を定義していきます。
1 2 3 4 5 6 7 8 9 10 11 |
public abstract class AbstractCalculater { public abstract void start(); public abstract void calculate(); public abstract void end(); public final void show() { start(); calculate(); end(); } } |
コンストラクタで受け取った整数を二乗して出力する簡単なクラスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class IntCalculater extends AbstractCalculater { private int m_num; public IntCalculater(int num) { this.m_num = num; } @Override public void start() { System.out.println("start"); } @Override public void calculate() { System.out.println(m_num * m_num); } @Override public void end() { System.out.println("end"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class DoubleCalculater extends AbstractCalculater { private double m_num; DoubleCalculater(double num) { this.m_num = num; } @Override public void start() { System.out.println("+++start+++"); } @Override public void calculate() { System.out.println(m_num * m_num * m_num); } @Override public void end() { System.out.println("++++end++++"); } } |
1 2 3 4 5 6 7 8 9 10 |
public class Main { public static void main(String[] args) { AbstractCalculater intCal = new IntCalculater(10); AbstractCalculater doubleCal = new DoubleCalculater(10.1); intCal.show(); doubleCal.show(); } } |
1 2 3 4 5 6 |
start 100 end +++start+++ 1030.301 ++++end++++ |
①ロジックの共通化ができる
これは一目瞭然だと思います。
サンプルコードでいうとIntCalculater,DoubleCalculaterクラスのロジックが共通化されています。
バグ修正が簡単になったりします。
②スーパークラスで宣言されている抽象メソッドをしっかり理解する必要がある
AbstractCalculaterクラスの実装を理解してからでないとサブクラスによる実装ができません。
これにより、変な実装ミスがなくなったりします。
③サブクラスをスーパークラスと同一視する
スーパークラスの変数にサブクラスのインスタンスを代入できるようになっています。
再利用性が高まっていますね:)