在运行时切换实现



我在写一个简单的聊天系统。应该有两种通信实现:

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

实现由用户在GUI中选择。

那么,是否可以使用if-elseswitch来选择实现呢?
我想过Java反射,但我不知道如何实现它。有什么建议吗?

我想说使用if-else或switch语句来选择实现是"可以的"。一个更好的(更面向对象的)方法应该是这样的:

//////////////////////////////////
// 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()方法只需要知道注册表,而不再需要单独的实现。

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

相关内容

  • 没有找到相关文章

最新更新