概要
デザインパターンのTemplateMethodパターンの練習用の実装とそれに関することをまとめてみました。
サンプルプログラム
大きな枠組みやロジックを決めるスーパークラスとしてAbstractFilterクラスを定義。サブクラスにOddNumFilter, EvenNumFilterを定義。全体の流れとしては数字の配列を篩いわけて特定の数字の配列(今回は奇数配列、偶数配列)を出力する。
AbstractFilter.java
import java.util.List;
public abstract class AbstractFilter {
public abstract List<Integer> filter(int[] numbers);
public void print(int[] numbers) {
List<Integer> filterNums = filter(numbers);
for (Integer num : filterNums) {
System.out.print(num + " ");
}
System.out.println();
}
}
OddNumFilter.java
import java.util.LinkedList;
import java.util.List;
public class OddNumFilter extends AbstractFilter {
@Override
public List<Integer> filter(int[] numbers) {
List<Integer> result = new LinkedList<Integer>();
for (int num : numbers) {
if (num % 2 != 0) {
result.add((Integer) num);
}
}
return result;
}
}
EvenNumFilter.java
import java.util.LinkedList;
import java.util.List;
public class EvenNumFilter extends AbstractFilter {
@Override
public List<Integer> filter(int[] numbers) {
List<Integer> result = new LinkedList<Integer>();
for (int num : numbers) {
if (num % 2 == 0) {
result.add(num);
}
}
return result;
}
}
これでおそらくTemplateMethodパターンに乗っ取ったクラス設計になっていると思う。このクラスを使ってメインクラスで実行してみます。
Main.java
public class Main {
public static void main(String args[]) {
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
AbstractFilter odd = new OddNumFilter();
AbstractFilter even = new EvenNumFilter();
System.out.println("---- 奇数表示 ----");
odd.print(numbers);
System.out.println("---- 偶数表示 ----");
even.print(numbers);
}
}
Result
---- 奇数表示 ----
1 3 5 7 9
---- 偶数表示 ----
2 4 6 8 10
うまく数字の配列をフィルターの性質ごとに篩いにかけることが出来ました。
まとめ
- スーパークラスで大きな枠組みやロジックを決めて、サブクラスで具体的な処理を書くようなデザインパターン。
- ロジック自体はスーパークラスが共通で担っているので、修正が必要な時も修正範囲が少なくすむと考えられる。
- スーパークラスにどこまでの処理を担わせるかは設計する人による。
- JavaのInputStreamクラスはTemplate Methodパターンに乗っ取って設計されている。