0

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

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

实现由用户在 GUI 中选择。

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

4

2 回答 2

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()方法只需要知道注册表,而不再需要了解各个实现。

于 2013-06-06T14:24:47.367 回答
0

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

于 2013-06-06T18:06:08.280 回答