Design Patterns : Strategy 2018/9
• インターフェースの活用により実行時にアルゴリズムを切り替えるパターン。
• 1つのインターフェースを複数のクラスが実装することにより実現する。
UML
インターフェース
アルゴリズムクラス1
アルゴリズムクラス2
アルゴリズムクラス3
コンテクストクラス
テストクラス
• インターフェースの活用により実行時にアルゴリズムを切り替えるパターン。
• 1つのインターフェースを複数のクラスが実装することにより実現する。
UML
インターフェース
public interface IStrategy {
Integer getNumber(int i);
}
アルゴリズムクラス1
public class StrategyNegative implements IStrategy {
public Integer getNumber(int i) {
return new Integer(i * -1);
}
アルゴリズムクラス2
import java.lang.Math;
public class StrategyAbsolute implements IStrategy {
public Integer getNumber(int i) {
return new Integer(Math.abs(i));
}
}
アルゴリズムクラス3
public class StrategyZero implements IStrategy {
public Integer getNumber(int i) {
return new Integer(0);
}
}
コンテクストクラス
public class Context {
private IStrategy strategy;
public void setStrategy(IStrategy strategy) {
this.strategy = strategy;
}
public Integer getNumber(int i) {
return strategy.getNumber(i);
}
}
テストクラス
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Client {
public static void main(String... args) throws Exception {
Context context = new Context();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
IStrategy abs = new StrategyAbsolute();
IStrategy ntv = new StrategyNegative();
IStrategy zro = new StrategyZero();
try {
while (true) {
System.out.print("数字を入力して下さい > ");
Integer i = new Integer(br.readLine());
if (i < 0) {
context.setStrategy(abs);
}
else if (i < 100) {
context.setStrategy(ntv);
}
else if(i <= -100 || 100 <= i) {
context.setStrategy(zro);
}
System.out.println(context.getNumber(i));
}
}
catch (NumberFormatException nfe) {
System.out.println("終了します");
}
}
}