2015-10-08 30 views
2

我正在重構接受來自終端的命令的Java應用程序。目前,有一個巨大的if-else結構檢查發出的命令並執行所需的方法。我想知道是否有可能用完善的設計模式取代這種邏輯。 我看了一下命令模式和策略模式,但在這種情況下似乎無法擺脫困境。請建議。接受終端命令的設計模式

更新: 我確實使用JCommander,但這並沒有擺脫if-else結構。

MyCommand cmd1 = new MyCommand(); 
    ... 
    ... 
    MyCommandN cmdN = new MyCommandN(); 
    JCommander cmd = new JCommander(); 
    cmd.addCommand("myCommand1", cmd1); 
    ... 
    ... 
    cmd.addCommand("myCommandN", cmdN); 
    try { 
     cmd.parse(args); 
     // 
     if ("myCommand1".equals(cmd.getParsedCommand())) { 
      System.out.println("running command1"); 
     } 
     ... 
     ... 
     else if ("myCommandN".equals(cmd.getParsedCommand())) { 
      // Sysout statements only for illustration. I call command specific methods here. 
      System.out.println("running commandN"); 
     } else { 
      cmd.usage(); 
     } 
     // 
    } catch (ParameterException ex) { 
     System.out.println(ex.getMessage()); 
     cmd.usage(); 
    } 
+0

見(https://stackoverflow.com/questions [哪些Java設計模式最適合的if-else語句,包括循環?]/33010710)。 –

回答

1

介紹一個共同的命令界面和使用地圖

Map<String, Command> commands = new HashMap<String, Command>(); 
commands.put("myCommand1", new MyCommand()); 
commands.put("myCommandN", new MyCommandN()); 

JCommander cmd = new JCommander(); 
cmd.addCommand("myCommand1", cmd1); 
... 
cmd.addCommand("myCommandN", cmdN); 
try { 
    cmd.parse(args); 

    Command command = commands.get(cmd.getParsedCommand()); 
    if(command == null){ 
     cmd.usage(); 
    } 
    // execute command 
} 
... 
+0

真棒!正是我需要的......常識不是那些常見的後果:) – Pankaj

1

使用JCommander:http://jcommander.org/#Overview

還有其他的替代方案以及。另請參見:Command Line Parsing: Commons CLI alternatives?

+0

可能是我以前不是很清楚。我使用JCommander,但它不能幫助我擺脫if-esle結構。我已經添加了該問題的更新。如果你知道如何針對這個問題有更好的設計,請幫助。 – Pankaj

+0

作爲if-else的替代方案,如果您使用Java 7+,則可以在getParsedCommand()字符串上使用開關 –

+0

我知道switch case如何替換if else。但是如果其他問題不在這裏。問題是代碼很難閱讀,並且不是很可擴展。想想我必須支持一個額外命令的情況。我將不得不修改現有的結構以具有其他else-if或switch語句。這是糟糕的編程設計的一個例子。設計模式幫助我們設計我們的程序,使它們更具可讀性,鬆耦合性和可擴展性。您可能想開始閱讀有關設計模式的內容。越早越好。 – Pankaj