2012.01.22
Strategy パターン 関数オブジェクト (Java)
以前、Pythonで関数オブジェクトによるストラテジーパターン
(Strategy パターン (Python))を書いたので、
今回はJava版について書く。
まずはサンプル。
実行結果は以下。
それでは解説。
今回は文字列をソートする際の戦略を関数ブジェクトとして
Arrays.sortに渡すことで、それぞれ別のソート結果が出力される。
まず、StringLengthComparatorの実装を見てみると、
Comparatorインタフェースを実装している。
Arrays.sortではComparatorインタフェースを実装したクラスの
compareメソッドを用いてソートしている。
そこで、StringLengthComparatorクラスはComparatorインタフェースを
compareメソッドの中で文字列の長さを比較するように実装する。
また、インスタンスは1つで十分なため、無駄なインスタンス化を
防ぐためにシングルトンパターンを用いる。
使用するときには、StringLengthComparatorクラスのインスタンスを
Arrays.sortメソッドの第2引数に渡せばよい。
次に、無名クラスとして関数オブジェクトを用いる場合を見てみる。
StartUpクラスのmainメソッドでは、文字列の長さ降順にソートする
ためのcompareメソッドを無名クラスとして実装し、
Arrays.sortメソッドの第2引数に渡している。
これで、文字列配列は文字列の長さ降順にソートされる。
他ではまず使用しないため、クラスにするまでもない場合に
この方法でストラテジーパターンを実現できる。
(Strategy パターン (Python))を書いたので、
今回はJava版について書く。
まずはサンプル。
// 文字列の長さを比較するComparatorの実装
import java.util.*;
public class StringLengthComparator implements Comparator{
// シングルトン
private StringLengthComparator(){}
public static final StringLengthComparator
INSTANCE = new StringLengthComparator();
// 文字列の長さ比較
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
import java.util.*;
public class StartUp{
public static void main(String argv[]) {
String [] stringsArray = new String [] {"Yukishima", "Tanaka", "Michael"};
System.out.println("通常のソート");
Arrays.sort(stringsArray);
for(Object s : stringsArray) {
System.out.println(s);
}
System.out.println("文字列の長さで昇順ソート");
// StringLengthComparator impliments Comparatorを用いたストラテジーパターン
ComparatorcompStrategy = StringLengthComparator.INSTANCE;
Arrays.sort(stringsArray, compStrategy);
for(Object s : stringsArray) {
System.out.println(s);
}
System.out.println("文字列の長さで降順ソート");
// 無名クラスとして定義
Arrays.sort(stringsArray, new Comparator() {
public int compare(String s1, String s2) {
return s2.length() - s1.length();
}
});
for(Object s : stringsArray) {
System.out.println(s);
}
}
}
実行結果は以下。
通常のソート
Michael
Tanaka
Yukishima
文字列の長さで昇順ソート
Tanaka
Michael
Yukishima
文字列の長さで降順ソート
Yukishima
Michael
Tanaka
それでは解説。
今回は文字列をソートする際の戦略を関数ブジェクトとして
Arrays.sortに渡すことで、それぞれ別のソート結果が出力される。
まず、StringLengthComparatorの実装を見てみると、
Comparatorインタフェースを実装している。
Arrays.sortではComparatorインタフェースを実装したクラスの
compareメソッドを用いてソートしている。
そこで、StringLengthComparatorクラスはComparatorインタフェースを
compareメソッドの中で文字列の長さを比較するように実装する。
また、インスタンスは1つで十分なため、無駄なインスタンス化を
防ぐためにシングルトンパターンを用いる。
使用するときには、StringLengthComparatorクラスのインスタンスを
Arrays.sortメソッドの第2引数に渡せばよい。
次に、無名クラスとして関数オブジェクトを用いる場合を見てみる。
StartUpクラスのmainメソッドでは、文字列の長さ降順にソートする
ためのcompareメソッドを無名クラスとして実装し、
Arrays.sortメソッドの第2引数に渡している。
これで、文字列配列は文字列の長さ降順にソートされる。
他ではまず使用しないため、クラスにするまでもない場合に
この方法でストラテジーパターンを実現できる。








