我有一个类与我的套接字库与其他进程通信。但很快,我的一些团队成员将发布另一个套接字库。所以我必须用它替换socket通信模块。
所以我想用设计模式来抽象沟通方式。在这种情况下,哪种设计模式对我更好?我的类不应该直接访问我的套接字库。
答案 0 :(得分:3)
停止思考套接字。想想进程间通信API。否则你会设计一个太低级别的抽象。
你真的想做什么?在进程之间发送应用程序消发送通知?
改为创建更高级别的抽象。类似的东西:
public interface ICommunicationChannel
{
ApplicationMessage Receive();
void Send(ApplicationMessage);
event EventHandler<FailureEventArgs> ChannelFaulted;
}
..或者,如果您的消息应该从另一个终点推送:
public interface ICommunicationChannel
{
void Send(ApplicationMessage);
event EventHandler<FailureEventArgs> ChannelFaulted;
event EventHandler<MessageReceivedEventArgs> MessageReceived;
}
通过在该级别上进行操作,您可以与通信层松散耦合,并可以使用您喜欢的任何技术自由设计。
答案 1 :(得分:0)
我建议创建一个ProcessCommuniactionInterface。 此接口应根据您的需要公开基本操作和send(),receive(),callback()等。
现在它将有一个实现,例如SocketLib1ProcessCommuniactionImpl。
稍后当任何其他Lib出现时,再添加一个实现为SocketLib2ProcessCommuniactionImpl。
迁移方式取决于您的用例:
如果用例是使用第一个完全删除并开始使用第二个,则可以直接用第二个替换第一个实现。 (大多数组织都没有这样做,因为它存在风险并且可能导致回滚)
如果用例是在Lib上使用某些流,而其他Lib用于其他流(这种情况很可能是在你与之通信的某些进程使用Lib1而其他进程使用lib2时),你应该保留两种实现。这里有两种情况: 一个。当我们必须使用lib1以及何时使用lib2时,流程是固定的。转到静态配置文件,从那里获取数据并调用相应的实现。 湾我们需要能够动态使用其中一个库。在这里寻找类似战略模式的东西。
希望这会有所帮助:)