【问题标题】:A design pattern for two different "strategies", that do not implement the same interface两种不同“策略”的设计模式,它们不实现相同的接口
【发布时间】:2019-03-23 21:33:11
【问题描述】:

我用 ReactJS 和 SocketIO 构建了一些程序,它作为一个完全可定制的工具来与 socketIO 服务器通信。

您可以注册要监听的事件、发送任何类型的消息、将配置对象传递给连接等。

现在我决定添加对本机 websocket 的支持。问题是,本机 Web 套接字更简单,并且没有实现与 SocketIO 相同的功能。

例如,我的 React 容器中有这个方法(我所有的主要逻辑都集中在其中,没有 Redux):

registerEventToSocket = (instanceId, socket, eventName) => {
      socket.off(eventName);

      socket.on(eventName, (...args) => {           
        const lastArg = args[args.length - 1];
        const isFunction = this.isFunction(lastArg);

        if (isFunction) {
          lastArg();//If a callback was supplied from the server, it is invoked.
          var index = args.indexOf(lastArg);
          if (index > -1) {
            args.splice(index, 1);
          }

        }

        this.addMessageToState(instanceId, eventName, args, false)
      })
    }

当用户“添加一个事件”来监听时调用这个方法。在原生 websocket 的情况下,只有一个事件需要监听,即“onmessage”事件,所以这整个功能是无关紧要的。

应用程序会做一些对原生套接字无用的事情,例如“侦听所有传入事件”的选项。

我试图想出一些好的设计模式,我可以用它在这里创建一些多态性,以处理 SocketIO 情况和本机情况。

我熟悉“策略模式”,我经常使用它,但在我的情况下,这两个“策略”都会实现两个不同的接口,这将违反 SOLID 原则。

有什么建议吗?

【问题讨论】:

    标签: reactjs design-patterns websocket socket.io


    【解决方案1】:

    这是一个典型程序的有机演变。我认为您现在的主要问题是决定您的基线驱动程序将支持哪些功能。就目前而言,客户端与实现(SocketIO)过于耦合。您需要为所有 WebSocket 驱动程序定义一个接口并对其进行调整。

    策略模式在这里不适用,这是一种行为模式。这是一个结构性问题。您可以根据自己的要求使用适配器或桥接器。

    【讨论】:

    • 非常好,谢谢!但是我将如何处理仅与 SocketIO 相关的方法,例如我提到的 listenToAllEvents? NativeSocket 不能也不应该实现这样的方法。处理两个模块实现的接口仅部分相同的情况的好方法是什么?
    • 当实现不支持方法时,它不应该处理请求(方法调用)。这很常见。不返回任何内容或空数组或 null 等都是有效的空操作。
    • 不幸的是,这是支持多种实现的代价:你必须支持最小公分母风格,失去某些实现的特定功能,除非你认为它足够重要,所以你包括它在您的基础客户端中,大多数实现都不会对其进行操作。
    • 不,它实际上符合 Liskov 替换原则,允许在没有问题的情况下交换实现。无操作覆盖非常常见。
    • 客户不必担心实现是否支持特定功能。它可以简单地假设它没有后果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2019-10-02
    • 2012-08-21
    • 1970-01-01
    • 2010-12-29
    • 2018-02-27
    相关资源
    最近更新 更多