2011-06-30 10 views
5

के लिए संशोधित करना मेरे पास निम्नलिखित है यदि अन्य जावा में शाखा है।यदि रणनीति पैटर्न

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

बजाय हो सकता है आप Enums उपयोग करने पर विचार और बयानों स्विच कर सकते हैं? यदि आपको अंतर्निहित कार्यान्वयन को स्वैप करने की आवश्यकता है तो रणनीति पैटर्न समझ में आएगा। क्लासिक उदाहरण अलग सॉर्टिंग एल्गोरिदम होगा। – 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

संबंधित मुद्दे