繁体   English   中英

如何将 switch-case 替换为 OOP

[英]How to replace switch-case to OOP

我有从数据库中获取数据的方法。 根据用户通过控制台输入的变量,我必须执行所需的方法

       while (flag) {
           try {
               sw = new ScannerWrapper();
               menuHeader();
               int choice = sw.readInt();
               switch (choice) {
                   case 1:
                       System.out.println("Input first name: ");
                       String name = sw.readLine().toUpperCase();
                       printResults(DataParser.getFilmByName(name));
                       break;
                     case 0:
                       System.out.println("Bye-bye. Come again");
                       flag = false;
                       break;
                   default:
                       System.out.println("Please enter correct number");
               }
           } catch (Exception e) {
               System.out.println("Enter correct data");
           } finally {
               DBConnector.getInstance().closeConnection();
           }
       }

这段代码很烂,方法有5种以上,代码变得多余

你应该看看Strategy设计模式。 这将允许您抽象与操作相关的逻辑。

最重要的是,您要替换开关以根据输入变量找到正确的策略。 这就是Factory设计模式的工作,在您的情况下,它会根据数据库值返回不同的策略之一。

基本上:

interface UserAction { 
    public void execute();
}

class ListMovies implements UserAction { 
    public void execute() {
        // List the movies
    }
}

class ExitProgram implements UserAction { 
    public void execute() {
        // Kill kenny
    }
}

class Noop implements UserAction { 
    public void execute() {
        // Do nothing
    }
}

还有一个工厂:

class UserActionFactory {
    public UserAction make(int actionId) {
        switch (actionId) {
            0: return new ListMovies();
            1: return new ExitProgram();
            default: return new Noop();
        }
    }
}

然后允许:

UserActionFactory factory = new UserActionFactory();
ScannerWrapper sw = new ScannerWrapper();

while (true) {
    menuHeader();
    int choice = sw.readInt();
    UserAction action = factory.make(choice);
    action.execute();

}

这也可能是Command设计模式,取决于您如何命名事物并为其余类实例化对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM