2014-12-07 103 views
0

我有一个基于PircBotX框架的Java bot。一个IRC机器人只是回复命令。所以现在我有一个静态字符串列表,例如: !weather,!lastseen和我的Main.java文件中的喜欢。创建模块Java

对于我添加的每个命令,我创建一个新的静态字符串,并比较每个传入的消息是否以任何定义的命令开头。

Receive message `m` 
    if m matches !x 
    -> do handleX() 
    if m matches !y 
    -> do handleY() 

这是basicly一个非常大的,如果测试。

我想要做的是创建某种骨架类,它可能实现了一个接口并定义了它应该在哪个命令上行动,以及定义了它应该执行的代码的主体。东西我想的是如下图所示:在这样一类

public class XkcdHandler implements CommandHandlerInterface 
{ 
    public String getCommand() 
    { 
     return "!xkcd"; 
    } 

    public void HandleCommand(String[] args, Channel ircChannel) 
    { 
     // Get XKCD.. 
     ircChannel.send("The XKCD for today is .."); 
    } 
} 

我可以简单地添加一个新的类,并用它做。现在我必须添加命令,在列表中添加if测试,并将该方法添加到Main.java类。这仅仅是一个软件架构的好例子。

有没有一种方法可以创建自动加载这些类(或这些类的实例)的东西,然后调用类似invokeMatchingCommand()的东西?然后,此代码可以迭代已加载命令的列表,并在匹配的实例上调用HandleCommand

更新 随着BalckEye记答案我想我可以加载在一个包(即Modules),实例化并将其存储在列表中找到的所有类。通过这种方式,我可以按照他的回答中所示处理每条消息(即迭代列表并为每个匹配命令执行类方法)。

但是,根据this thread,它似乎并不真正可行。在这一点上,我看看类加载器,也许这将是一个可行的解决方案。

+0

老实说,我得到你想要动态做到这一点,但它是一个相当麻烦来做到这一点。当你使用user4335475的方法时,它会很简单和干净。另外,它更多的API风格:P – engineercoding 2014-12-08 17:33:38

回答

1

有几种方法,我认为。你可以使用一个Map作为键和一个执行你的代码作为值的接口。事情是这样的:

Map<String, CommandInterface> commands = new .... 

,然后使用地图这样的:

CommandInterface cmd = commands.get(command); 
if(cmd != null) { 
    cmd.execute(); 
} 
0

您正在寻找静态块,如:

class main { 
    private static List<CommandHandlerInterface> modules = new ArrayList<...>(); 

    static { // gets called when a static member gets accessed for the first time (once per class) 
     modules.add(new WeatherCommand()); 
     // etc. 
    } 

    // method here which iterates over modules and checks 
}