我应该使用模式

时间:2018-09-26 15:01:25

标签: java design-patterns

因此,我从twitch irc接收了一个字符串,并根据该命令执行了一些代码。问题是我可以简化代码还是使用模式。关键是大多数命令具有相同的代码,只有回复会更改。您可以在下面看到代码。看起来很乱,添加新命令或功能可能很麻烦(如果我有200条或更多命令),而且大多数代码都是相同的。

public void onCommand(User user, Channel channel, String command)
    {

        // some if statements 

        switch (command.toLowerCase()){
        case "hi":{

            //some simple action
        }
        case "fire":{

            vote(60, channel, "fire")
        }
        ...

        //timeout
    }

    void vote(int duration, final Channel channel, String voteFor){
        Timer timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //start voting
            }, duration);

            switch (voteFor){
                case "fire":{
                    if (voteYes > voteNo) {
                        //some action
                    }else
                        //some action
                    break;
                }
                ...
    }  

P.S,我尝试使用策略模式,但感觉没有必要。

2 个答案:

答案 0 :(得分:2)

您可以定义一个接口,例如Command

public interface Command {

    void execute(User user, Channel channel);

}

然后,创建一个从命令名称到实际命令的映射。

Map<String, Command> commands;

您可以按照以下步骤填充地图

commands.put("fire", (user, channel) -> {/** Do something with user and channel **/})

然后,对于您的onCammnd,您可以这样做

commands.get(command.toLowerCase()).execute(user, channel);

答案 1 :(得分:1)

使用地图:

class CommandProcessor {

  interface Command {
    String executeForKey();
    void execute(User user, Channel channel);
  }

  class OnFireCommand implements Command {
    public String executeForKey() { return "fire"; }
    public void execute() {}
  }

  Map<String, Command> map = new HashMap<>();

  CommandProcessor() {
    // this will become a simple listing of commands
    put(new OnFireCommand())
  }

  void put(Command c) {
    map.put(c.executeForKey(), c);
  }

  public void onCommand(User user, Channel channel, String command) {
    this.map.get(command).execute(user, channel);
  }
}