liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - 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