当我想抽象进程间通信时,哪种设计模式更好?

时间:2016-04-22 10:18:54

标签: design-patterns

我有一个类与我的套接字库与其他进程通信。但很快,我的一些团队成员将发布另一个套接字库。所以我必须用它替换socket通信模块。

所以我想用设计模式来抽象沟通方式。在这种情况下,哪种设计模式对我更好?我的类不应该直接访问我的套接字库。

2 个答案:

答案 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。

迁移方式取决于您的用例:

  1. 如果用例是使用第一个完全删除并开始使用第二个,则可以直接用第二个替换第一个实现。 (大多数组织都没有这样做,因为它存在风险并且可能导致回滚)

  2. 如果用例是在Lib上使用某些流,而其他Lib用于其他流(这种情况很可能是在你与之通信的某些进程使用Lib1而其他进程使用lib2时),你应该保留两种实现。这里有两种情况:     一个。当我们必须使用lib1以及何时使用lib2时,流程是固定的。转到静态配置文件,从那里获取数据并调用相应的实现。     湾我们需要能够动态使用其中一个库。在这里寻找类似战略模式的东西。

  3. 希望这会有所帮助:)