使用网络流的 Facade 与 Adapter 设计模式

Facade vs. Adapter design pattern using network a stream

假设我有三个名为 Phone 的 SDK class、DigitalClock 和 DigitalCompass,它们隐含地表示数字设备。

这些 classes 支持:

不幸的是,这些 classes 不能 被更改并且它们不继承任何东西。

现在,我有一个支持以下操作的UDP服务和TCP服务:

问题:我希望这些设备能够通过互联网传输和接收流。

解决方案: 我想了两种方法来设计上面的问题,我测试了它们,它们都有效:

  1. 用类似 Facade 的设计模式包装每个 class,如下所示:
    • StreamablePhone、StreamableDigitalClock 和 StreamableCompass。
    • 每个包装器 class 都将从 IStreamableDevice 继承。

结果: Phone->流到->StreamablePhone->发送到->UDP 服务->传输到->NET.

  1. 使用适配器设计模式包装这些 classes,如下所示:
    • 适配器:Phone、DigitalClock 和 DigitalCompass classes.
    • 适配器:UDP 服务和 TCP 服务从具有匹配名称的接口(以下目标)继承(IUdp* 与 UDP* 服务,ITcp 与 TCP 服务)。
    • 目标:
      • UDP 目标将是 IUdpPhone、IUdpDigitalClock 和 IUdpDigitalCompass。
      • TCP 目标将是 ITcpPhone、ITcpDigitalClock nad ITcpDigitalCompass。

结果: Phone->流到->IUdpPhone->传输到->NET.

我应该选择哪种方式来实现,考虑它是否支持添加更多设备或更多网络服务的场景。

这两种模式的主要区别之一是开发人员实施它们的意图。简而言之 Façade 是:

A single entry-point that represents an entire subsystem

Adapter 将:

Match interfaces of different classes

因此,在您的情况下,我会选择 Façade,因为您不想扩展隐藏在 Phone 中的功能。您所追求的(如果我理解正确的话)是简化(并封装)您的子系统与 Phone(结束)设备之间的通信。所以这里更好的匹配是 Façade,因为它定义了一个更高级的接口,使子系统更容易使用。如果你想更深入地阅读它,有一个概念叫做 Federation in the Enterprise application integration.

另一个在这里有用的模式是 Command design pattern,因为它将请求封装为一个对象,从而让您可以使用不同的请求、队列或日志请求来参数化客户端,并支持可撤消的操作。