两种不同“策略”的设计模式,它们没有实现相同的界面

时间:2019-03-23 21:33:11

标签: reactjs design-patterns websocket socket.io

我已经用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原则。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

策略模式不适用于此处,这是一种行为模式。这是一个结构性问题。您可以根据需要使用适配器或网桥。

enter image description here