Design Patterns : Strategy 2018/9

• インターフェースの活用により実行時にアルゴリズムを切り替えるパターン。
• 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("終了します");
        }
    }
}