2014-12-07 101 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 
}