我正在编写简单的聊天系统。通信的实现应该有两种:
- 使用序列化
- 和XML(自己的协议)。
实现由用户在 GUI 中选择。
那么,是否可以使用if-else或switch来选择实现?
我曾考虑过 Java 反射,但我不知道如何实现它。有什么建议么 ?
我正在编写简单的聊天系统。通信的实现应该有两种:
实现由用户在 GUI 中选择。
那么,是否可以使用if-else或switch来选择实现?
我曾考虑过 Java 反射,但我不知道如何实现它。有什么建议么 ?
我想说使用 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()
方法只需要知道注册表,而不再需要了解各个实现。
继承和普通的旧 Java 是这里使用的“模式”。实例化要使用的实现,并将对它的引用保存在需要使用它的对象中。当用户切换方法时,实例化新的方法。