LoginSignup
3
3

More than 5 years have passed since last update.

Template Method パターン

Last updated at Posted at 2014-07-30

概要

デザインパターンの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パターンに乗っ取って設計されている。
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3