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("終了します"); } } }