【问题标题】:Facade vs. Adapter design pattern using network a stream使用网络流的外观与适配器设计模式
【发布时间】:2015-05-06 23:09:24
【问题描述】:

假设我有三个 SDK 类,分别是 Phone、DigitalClock 和 DigitalCompass,它们隐含地表示数字设备。

这些类支持:

  • PC 到设备和设备到 PC 数据流。
  • 连接到 PC 或从 PC 断开连接等操作。

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

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

  • 获取数据并通过互联网传输。 (PC 到 NET)
  • 从互联网接收数据并返回。 (网络到 PC)

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

解决方案: 我想了两种方法来设计上述问题,我测试了它们,它们都可以工作:

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

结果: 手机->流到->StreamablePhone->发送到->UDP服务->传输到->NET。

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

结果: 电话->流到->IUdpPhone->传输到->NET。

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

【问题讨论】:

    标签: c# oop design-patterns adapter facade


    【解决方案1】:

    这两种模式的主要区别之一是开发人员实现它们的意图。总之Façade就是:

    代表整个子系统的单个入口点

    虽然Adapter 会:

    匹配不同类的接口

    所以在你的情况下,我将使用 Façade,因为你不想扩展对 Phone 隐藏的功能。您所追求的(如果我理解正确的话)是简化(并封装)您的子系统和电话(终端)设备之间的通信。所以这里更好的匹配是 Façade,因为它定义了一个更高级别的接口,使子系统更易于使用。如果你想更深入地阅读它,有一个概念叫做 FederationEnterprise application integration

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

    【讨论】:

    • 非常感谢您详细的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2010-10-03
    • 2014-08-01
    • 2012-08-12
    • 1970-01-01
    • 2012-05-25
    • 2011-03-30
    相关资源
    最近更新 更多