我有一个处理不同客户端类型的服务。许多服务类在处理不同客户端的方式上都有微小的差异。在大多数情况下,这些类包含所有客户机都通用的逻辑,但是有些地方有特定于客户机的逻辑。
我了解我可以使用Factory来为客户端特定的逻辑返回一组对象,或者使用Template方法为不同的客户端提供抽象类的具体实现-这些方法的问题在于在整个代码中必须根据客户端做出的细微分支决策,这些细微分支决策是微不足道的,彼此之间没有关联,因此不需要单独的类。是否有一种设计模式可以优雅地实现这一目标?
class Service {
void process() {
//....
if (client1) doStuff1();
if (client2) doStuff2();
//....
if (client1) name = "xyz";
else if (client2) name = "abc";
//....
if (client1) sortasc();
else sortdesc();
//....
if (client2) processx();
else if (client3) processy();
}
}
答案 0 :(得分:0)
您似乎陷入了一个陷阱。每个服务实现大部分相同,因此您要编写“通用”实现,然后编写客户端特定的扩展代码。但是,每次需要为客户端做一些特殊的事情时,最终都会修改公共服务的实现,这很快就会变得难以维护。
但是,实际上,没有规则规定每个客户的实现必须相同。如果有这样的规则,那么您将不会有太多例外。事实是,每个客户的处理都是不同的,而今天它们恰好是相同的。
您应该为每种类型的客户端进行单独的服务实现。
如果您现在开始说“但我不想重复所有通用代码!”,请停止。进行一些真正通用的部分,并将其提取到不同客户端实现可以调用的实用程序方法中。共享的代码量几乎相同...
class Client1Service implements Service {
void process() {
doCommonSetup();
doStuff1();
doCommonThing();
doStuffWithName("xyz");
sortasc();
doMoreCommonStuff();
processy();
}
}
...但是现在没有任何混乱的情况了,当您需要进行特定于客户端的更改时,有一个可以避免所有其他客户端的实现混乱的地方。
当您需要对公共部分进行更改时,也可以对这些内容进行单个实现。