2011-06-30 11 views
5

私はjavaでif-elseブランチを持っています。戦略パターンにif-elseを変更する

if (str.equals("a")) { A;} 
else if (str.equals("b")) { B;} 
else if (str.equals("c")) { C;} 
else if (str.length == 5) { D;} 
else { E;} 

このコードを戦略パターンに変更するにはどうすればよいですか。

+1

代わりに、あなたは、列挙型を使用することを検討して文を切り替えることができますすることはできますか?戦略パターンは、基礎となる実装を取り替える必要がある場合には理にかなっています。古典的な例は異なるソートアルゴリズムです。 – CoolBeans

答えて

9

ここに工場を使用して戦略パターンの例:

public interface Strategy { 
    public Object[] execute(Object[] args); 
} 

public class StrategyFactory { 

    public enum Name { 
     REVERSE, STRINGIFY, DUPLICATE; 
    } 

    private StrategyFactory() { 
     // never instantiate; only use static factory methods 
    } 

    public static Strategy getStrategyReverse() { 
     return new Strategy() { 
      public Object[] execute(Object[] args) { 
       Object[] reversed = new Object[args.length]; 
       for (int i = 0; i < args.length; i++) { 
        reversed[i] = args[args.length - i - 1]; 
       } 
       return reversed; 
      } 
     }; 
    } 

    public static Strategy getStrategyStringify() { 
     return new Strategy() { 
      public Object[] execute(Object[] args) { 
       String[] stringified = new String[args.length]; 
       for (int i = 0; i < args.length; i++) { 
        stringified[i] = String.valueOf(args[i]); 
       } 
       return stringified; 
      } 
     }; 
    } 

    public static Strategy getStrategyDuplicate() { 
     return new Strategy() { 
      public Object[] execute(Object[] args) { 
       Object[] duplicated = new Object[2 * args.length]; 
       for (int i = 0; i < args.length; i++) { 
        duplicated[i * 2] = args[i]; 
        duplicated[i * 2 + 1] = args[i]; 
       } 
       return duplicated; 
      } 
     }; 
    } 

    public static Strategy getStrategy(String name) { 
     return getStrategy(Name.valueOf(name)); 
    } 

    public static Strategy getStrategy(Name name) { 
     switch (name) { 
      case REVERSE: 
       return getStrategyReverse(); 
      case STRINGIFY: 
       return getStrategyStringify(); 
      case DUPLICATE: 
       return getStrategyDuplicate(); 
      default: 
       throw new IllegalStateException("No strategy known with name " + name); 
     } 
    } 
} 

public class Main { 
    public static void main(String[] args) { 

     Strategy strategy = StrategyFactory.getStrategy("DUPLICATE"); 
     System.out.println(Arrays.toString(strategy.execute(args))); 
    } 
} 
0

オブジェクト指向プログラミングについて考える必要があります。多型を使用する。 戦略パターンの場合は、 インターフェイスを定義し、インターフェイスを実装するクラスにさまざまな実装を提供します。コンテクストを選択し、クラスを同形的に決定する。 http://en.wikipedia.org/wiki/Strategy_pattern

if-elseの場合、正しいパターンは「工場パターン」に対応します。 http://en.wikipedia.org/wiki/Factory_method_pattern

関連する問題