【发布时间】:2020-06-18 07:31:47
【问题描述】:
所以想象一下,
给定一个类层次结构:
S (abstract)
A extends S
B extends S
假设我们有一个连接组件链来处理 A 和 B 类型的对象。例如:
K1.handle(A) -> K2.handle(A) -> K3.handle(A)
意思是 K1 接受 A 并用 A 调用 K2,它用 A 调用 K3。
同样我们有:
K1.handle(B) -> K2.handle(B) -> K3.handle(B)
事情是K2的逻辑不依赖于S的子类型。所以我们可以用K2.handle(S)替换K2.handle(A)和K2.handle(B)。但问题是在某些时候我们需要对实际对象类型进行类型检查才能调用正确的 K3 方法。
如果不执行检查实际对象的类型/属性的if 或switch 等语句,如何解决这个问题?
这是我需要研究的访问者模式吗?
举一个具体的例子。假设 K1 是一个 REST 控制器,A 和 B 具有不同的 POST 端点。它反序列化有效负载并验证数据,然后将对象传递给 K2 进行进一步处理。 K2 中包含的所有步骤(以及它调用的其他组件)都只适用于 S 类型的对象。但在 K3 的最后,我们需要知道 S 的实际类型。
【问题讨论】:
-
"K2 的逻辑不依赖于 S 的子类型" --- 确实如此,因为调用
K3.handle()是该逻辑的一部分,所以它确实依赖于S的子类型。 -
这个问题过于抽象,无法提供一个好的答案。常见模式包括让框架解析处理程序(如 Spring
ApplicationEvent)或使用责任链。 -
只要在S中定义了K3调用的方法,那么A和B都可以正常工作。
标签: java design-patterns dispatch