デザインパターン - strategy(戦略)
【strategyパターンとは】
実行時に戦略(アルゴリズム)を選択できる。
【strategyパターンのクラス図】
【strategyパターンのメリット】
実行時にアルゴリズムを切り替えられる。
たとえば、クライアントPCのスペックにより、高速モードにするか低速モードするかなど
【サンプル】
Person.java |
package strategy;
/*
* 人クラス
*/
public class Person {
public int age; // 年齢
public int height; // 身長
public int weight; // 体重
public Person(int age, int height, int weight) {
this.age = age;
this.height = height;
this.weight = weight;
}
// 比較アルゴリズムを渡す
public int compare(PersonComparator comparator, Person p) {
return comparator.compare(this, p);
}
}
|
PersonComparator.java |
package strategy;
// 比較IF
public interface PersonComparator {
public int compare(Person p1, Person p2);
}
|
AgeComparator.java |
package strategy;
// 年齢で比較
public class AgeComparator implements PersonComparator{
@Override
public int compare(Person p1, Person p2) {
if(p1.age > p2.age) {
return 1;
} else if(p1.age < p2.age) {
return -1;
} else {
return 0;
}
}
}
|
HeightComparator.java |
package strategy;
// 身長比較
public class HeightComparator implements PersonComparator {
@Override
public int compare(Person p1, Person p2) {
if(p1.height > p2.height) {
return 1;
} else if(p1.height < p2.height) {
return -1;
} else {
return 0;
}
}
}
|
StategyTest.java |
package strategy;
public class StategyTest {
public static void main(String args) {
// 20才、180cm, 80kg
Person p1 = new Person(20, 180, 80);
// 30才、175cm, 60kg
Person p2 = new Person(30, 175, 60);
// 年齢で比較したい
System.out.println(p1.compare(new AgeComparator(), p2));
// 身長で比較したい
System.out.println(p1.compare(new HeightComparator(), p2));
}
}
|
結果 |
-1
1
1
|
※体重で比較した場合、既存のクラスには修正加えず機能追加できる。
WeightComparator.java |
package strategy;
// 体重比較
public class WeightComparator implements PersonComparator{
@Override
public int compare(Person p1, Person p2) {
if(p1.weight > p2.weight) {
return 1;
} else if(p1.weight < p2.weight) {
return -1;
} else {
return 0;
}
}
}
|
StategyTest.java |
package strategy;
public class StategyTest {
public static void main(String args) {
// 20才、180cm, 80kg
Person p1 = new Person(20, 180, 80);
// 30才、175cm, 60kg
Person p2 = new Person(30, 175, 60);
// 体重で比較したい
System.out.println(p1.compare(new WeightComparator(), p2));
}
}
|
--b