因此,我从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,我尝试使用策略模式,但感觉没有必要。
答案 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);
}
}