我有大约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
。
对于像这样的设备识别方案,是否有更多可靠的设计模式?
答案 0 :(得分:1)
我建议以下事项:
IServerTypeDetector
函数创建一个detect
接口。IServerTypeDetector
不同的派生类。IServerTypeDetector
。该类将接收IServerTypeDetector
作为其构造函数中的依赖项执行。*任何问题,例如:“我应该并行运行”,类似的内容将在这个门面回答。
此外,根据类型,您可以返回A / B / C / ...而不是返回A / B / C / ...您可以返回自己的包装sdk,以便为您的用户提供特定服务器所需的外部sdk抽象。
告诉我你的想法。希望它有所帮助。
不是主要问题的一部分,但我会添加 - 您还可以为您返回的抽象/包装sdk添加地址缓存,这样第二次给出地址时您将不需要执行所有检测器。在这里,我将阅读一些关于面向方面的编程,如果你在C#和usig Castle Windsor,那么IInterceptors。通过这种方式,您可以保持代码清除这种额外的逻辑。