Java 运行时切换的实现

Java 运行时切换的实现,java,reflection,runtime,Java,Reflection,Runtime,我在写一个简单的聊天系统。通信应该有两种实现方式: 使用序列化 和XML(自己的协议) 实现由用户在GUI中选择 那么,可以使用if-else或switch来选择实现吗? 我曾经考虑过Java反射,但我不知道如何实现它。 有什么建议吗 我认为可以使用if-else或switch语句来选择实现。更好的(更面向对象的)方法应该是这样的: ////////////////////////////////// //通信接口 ////////////////////////////////// 公共接

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

  • 使用序列化
  • 和XML(自己的协议)
实现由用户在GUI中选择

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

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

//////////////////////////////////
//通信接口
//////////////////////////////////
公共接口IChatCommunicationFactory{
公共字符串toString();
公共IChatCommunication create();
}
公共接口通信{
公共发送聊天线(字符串聊天线);
公共注册chatLineReceiver(IChatLineReceiver chatLineReceiver);
}
公共接口IChatLineReceiver{
接收到公共void onchatline(字符串chatLine);
}
//////////////////////////////////
//通信接口的实现
//////////////////////////////////
公共类XMLChatCommunicationFactory实现IChatCommunicationFactory{
公共字符串toString(){
返回“XML实现”;
}
公共IChatCommunication创建(){
返回新的XMLChatCommunication();
}
}
公共类XMLChatCommunication实现IChatCommunication{
私有XMLProtocolSocket套接字;
公共通信(){
//安装插座
}
公共发送聊天线(字符串聊天线){
//发送您的聊天热线
}
公共注册chatLineReceiver(IChatLineReceiver chatLineReceiver){
//启动线程,在该线程中处理接收到的聊天行,然后将其传递给IChatLineReceived的onChatLineReceived
}
}
//对序列化实现执行与上面相同的操作。
//////////////////////////////////
//用户界面
//////////////////////////////////
公共void使用通讯实现填充ListBox(ListBox ListBox){
addItem(新的XMLChatCommunicationFactory());
addItem(新的SerializationChatCommunicationFactory());
}
公共IChatCommunication GetChatCommunicationsImplementationByUserSelection(列表框列表框){
if(listBox.selectedItem==null)
返回null;
IChatCommunicationFactory=(IChatCommunicationFactory)列表框。选择编辑项;
返回factory.create();
}

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

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

如何处理?如果您使用HTTP,还可以在标头中指定MIME类型,并使用该类型通过
内容类型
选择反序列化中要使用的实现。(请参阅。)我认为工厂模式在这里使用不正确。我将使用您的
IChatCommunication
接口和
XMLChatCommunication
类。不要将
XMLChatCommunicationFactory
添加到
listBox
,只需添加
XMLChatCommunication
。检索所选内容时,将其转换为
IChatCommunication
,即可完成。如果您需要延迟
IChatCommunication
实例的初始化,只需在接口中创建一个
init()
方法。我也考虑过先做类似的事情。我觉得一个对象在使用之前不需要调用某种
init()
方法。相反,工厂(或
IChatCommunication
对象的构造函数)应该做所有必要的准备。但是,我同意,如果您愿意,也可以使用附加的
init()
方法替换工厂。毕竟,“最佳”解决方案的选择将取决于设置(主机名、端口等)应如何通过类结构传递,以及应如何处理具有多个协议的多个连接。