使用网络流的 Facade 与 Adapter 设计模式
Facade vs. Adapter design pattern using network a stream
假设我有三个名为 Phone 的 SDK class、DigitalClock 和 DigitalCompass,它们隐含地表示数字设备。
这些 classes 支持:
- PC 到设备和设备到 PC 数据流。
- 连接到 PC 或断开 PC 等操作。
不幸的是,这些 classes 不能 被更改并且它们不继承任何东西。
现在,我有一个支持以下操作的UDP服务和TCP服务:
- 获取数据并通过互联网传输。 (PC 到 NET)
- 从互联网接收数据并return它。 (网络到 PC)
问题:我希望这些设备能够通过互联网传输和接收流。
解决方案:
我想了两种方法来设计上面的问题,我测试了它们,它们都有效:
- 用类似 Facade 的设计模式包装每个 class,如下所示:
- StreamablePhone、StreamableDigitalClock 和 StreamableCompass。
- 每个包装器 class 都将从 IStreamableDevice 继承。
结果:
Phone->流到->StreamablePhone->发送到->UDP 服务->传输到->NET.
- 使用适配器设计模式包装这些 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,因为它将请求封装为一个对象,从而让您可以使用不同的请求、队列或日志请求来参数化客户端,并支持可撤消的操作。
假设我有三个名为 Phone 的 SDK class、DigitalClock 和 DigitalCompass,它们隐含地表示数字设备。
这些 classes 支持:
- PC 到设备和设备到 PC 数据流。
- 连接到 PC 或断开 PC 等操作。
不幸的是,这些 classes 不能 被更改并且它们不继承任何东西。
现在,我有一个支持以下操作的UDP服务和TCP服务:
- 获取数据并通过互联网传输。 (PC 到 NET)
- 从互联网接收数据并return它。 (网络到 PC)
问题:我希望这些设备能够通过互联网传输和接收流。
解决方案: 我想了两种方法来设计上面的问题,我测试了它们,它们都有效:
- 用类似 Facade 的设计模式包装每个 class,如下所示:
- StreamablePhone、StreamableDigitalClock 和 StreamableCompass。
- 每个包装器 class 都将从 IStreamableDevice 继承。
结果: Phone->流到->StreamablePhone->发送到->UDP 服务->传输到->NET.
- 使用适配器设计模式包装这些 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,因为它将请求封装为一个对象,从而让您可以使用不同的请求、队列或日志请求来参数化客户端,并支持可撤消的操作。