Facade与适配器设计模式使用网络流

时间:2015-03-05 14:31:24

标签: c# oop design-patterns adapter facade

假设我有三个名为Phone,DigitalClock和DigitalCompass的SDK类,它们代表隐式数字设备。

这些类支持:

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

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

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

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

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

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

  1. 用类似Facade的设计模式包装每个类,如下所示:
    • StreamablePhone,StreamableDigitalClock和StreamableCompass。
    • 每个包装类都将继承自IStreamableDevice。
  2. 结果:     电话 - >流到 - > StreamablePhone->发送到 - > UDP服务 - >传输到> NET。

    1. 使用适配器设计模式包装这些类,如下所示:
      • 适应者:电话,DigitalClock和DigitalCompass课程。
      • 适配器:UDP服务和来自具有匹配名称的接口(以下目标)的TCP服务继承(IUdp *与UDP *服务,ITcp与TCP服务)。
      • 目标:
        • UDP目标是IUdpPhone,IUdpDigitalClock和IUdpDigitalCompass。
        • TCP目标将是ITcpPhone,ITcpDigitalClock和ITcpDigitalCompass。
    2. 结果:     电话 - >流到 - > IUdpPhone->传输到 - > NET。

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

1 个答案:

答案 0 :(得分:2)

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

  

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

虽然Adapter会:

  

匹配不同类的接口

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

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