设计模式在没有Ifs系列的情况下检测设备类型

时间:2016-06-19 20:45:54

标签: design-patterns

我有大约50种类型的服务器,每种服务器都提供不同的API / SDK用于连接和控制。

只给出服务器的地址,我的任务是编写一个客户端程序,以便合理地快速确定服务器的类型。

棘手的部分是每个服务器都提供了截然不同的API / SDK用于识别。这些API不受我的控制。为了检测服务器类型,我会天真地做这样的事情:

function detectServerType(String address) {

  bool isServerTypeA = proprietaryRoutineToCheckIfTypeA(address);
  if (isServerTypeA) {
    return "A";
  }

  bool isServerTypeB = proprietaryRoutineToCheckIfTypeB(address);
  if (isServerTypeB) {
    return "B";
  }

  ...

  bool isServerTypeZ = proprietaryRoutineToCheckIfTypeZ(address);
  if (isServerTypeZ) {
    return "Z";
  }

} /* This routine takes a long time! */

这些服务器和proprietaryRoutine由不同的制造商制造,并且完全不受我控制。每个服务器类型都必须通过其独特的过程进行检测。

为了缩短时间,我们可以并行运行这些检查。

function detectServerType(String address, Callback callbackIfSuccess) {

  callProprietaryRoutineToCheckIfTypeAInNewThread(address, callbackIfSuccess);
  callProprietaryRoutineToCheckIfTypeBInNewThread(address, callbackIfSuccess);
  ...
  callProprietaryRoutineToCheckIfTypeZInNewThread(address, callbackIfSuccess);

}

通过这种方式,我可以快速开始检查所有50种类型的服务器,并在获得一个成功结果后立即运行callbackIfSuccess

对于像这样的设备识别方案,是否有更多可靠的设计模式?

1 个答案:

答案 0 :(得分:1)

我建议以下事项:

  1. 使用IServerTypeDetector函数创建一个detect接口。
  2. 对于您要支持的每个不同的API / SDK,都有一个与IServerTypeDetector不同的派生类。
  3. 有一个Facade类,它将获取一个地址,并将运行所有这些不同的IServerTypeDetector。该类将接收IServerTypeDetector作为其构造函数中的依赖项执行。
  4. *任何问题,例如:“我应该并行运行”,类似的内容将在这个门面回答。

    此外,根据类型,您可以返回A / B / C / ...而不是返回A / B / C / ...您可以返回自己的包装sdk,以便为您的用户提供特定服务器所需的外部sdk抽象。

    告诉我你的想法。希望它有所帮助。

    不是主要问题的一部分,但我会添加 - 您还可以为您返回的抽象/包装sdk添加地址缓存,这样第二次给出地址时您将不需要执行所有检测器。在这里,我将阅读一些关于面向方面的编程,如果你在C#和usig Castle Windsor,那么IInterceptors。通过这种方式,您可以保持代码清除这种额外的逻辑。