所以想象一下,
给定一个类层次结构:
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的实际类型。
发布于 2020-06-18 16:27:16
是的,这是一个访问者模式。
参观者是
interface K {
    void handle(A a);
    void handle(B b);
}并由K1、K2、K3实现。
S需要的是一个带有实现的方法visit(K)
class A implements S {
    public void visit(K visitor) {
        visitor.handle(this); // calls the handle(A) method
    }
}
class B implements S {
    public void visit(K visitor) {
        visitor.handle(this); // calls the handle(A) method
    }
}你的列表(即你的链条)只是一个List<K>,其内容类似于
List<K> handlers = Arrays.asList(new K1(), new K2(), new K3());
S sample = new A();
for (K visitor : handlers) {
    sample.visit(visitor);
}
sample = new B();
for (K visitor : handlers) {
    sample.visit(visitor);
}这是一个running version。
https://stackoverflow.com/questions/62444663
复制相似问题