在运行时切换实现

时间:2013-06-06 13:58:59

标签: java reflection runtime

我正在编写简单的聊天系统。应该有两种沟通方式:

  • 使用序列化
  • XML (自己的协议)。

用户在GUI中选择实现。

那么,是否可以使用 if-else switch 来选择实现? 我考虑过Java Reflection,但我无法弄清楚如何实现它。 有什么建议 ?

2 个答案:

答案 0 :(得分:1)

我会说使用if-else或switch语句来选择实现是“没问题”。一个更好的(和更多的OOP)方法将是这样的:

//////////////////////////////////
// The communication interfaces
//////////////////////////////////

public interface IChatCommunicationFactory {
    public String toString();
    public IChatCommunication create();
}

public interface IChatCommunication {
    public sendChatLine(String chatLine);
    public registerChatLineReceiver(IChatLineReceiver chatLineReceiver);
}

public interface IChatLineReceiver {
    public void onChatLineReceived(String chatLine);
}

//////////////////////////////////
// The communication interface implementations
//////////////////////////////////

public class XMLChatCommunicationFactory implements IChatCommunicationFactory {
    public String toString() {
        return "XML implementation";
    }

    public IChatCommunication create() {
        return new XMLChatCommunication();
    }
}

public class XMLChatCommunication implements IChatCommunication {
    private XMLProtocolSocket socket;

    public XMLChatCommunication() {
        // set up socket
    }

    public sendChatLine(String chatLine) {
        // send your chat line
    }

    public registerChatLineReceiver(IChatLineReceiver chatLineReceiver) {
        // start thread in which received chat lines are handled and then passed to the onChatLineReceived of the IChatLineReceiver
    }
}

// Do the same as above for the Serialization implementation.


//////////////////////////////////
// The user interface
//////////////////////////////////

public void fillListBoxWithCommuncationImplementations(ListBox listBox) {
    listBox.addItem(new XMLChatCommunicationFactory());
    listBox.addItem(new SerializationChatCommunicationFactory());
}

public IChatCommunication getChatCommunicationImplementationByUserSelection(ListBox listBox) {
    if (listBox.selectedItem == null)
        return null;

    IChatCommunicationFactory factory = (IChatCommunicationFactory)listBox.selectedItem;
    return factory.create();
}

您可以更进一步实施类似ChatCommunicationFactoryRegistry的内容,其中每个IChatCommunicationFactory都已注册。这将有助于将“业务”逻辑移出用户界面,因为fillListBoxWithCommuncationImplementations()方法只需要知道注册表,而不是单独的实现。

答案 1 :(得分:0)

继承和普通旧Java是这里使用的“模式”。实例化要使用的实现,并在需要使用它的对象中保存对它的引用。当用户切换方法时,实例化新方法。