首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从子类到超类,然后再返回

从子类到超类,然后再返回
EN

Stack Overflow用户
提问于 2020-06-18 15:31:47
回答 4查看 60关注 0票数 2

所以想象一下,

给定一个类层次结构:

代码语言:javascript
运行
复制
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方法。

如果不使用ifswitch等语句来检查实际对象的类型/属性,如何解决这个问题呢?

这是我需要查看的访问者模式吗?

给出一个具体的例子。假设K1是一个REST控制器,具有A和B的不同POST端点。它反序列化有效负载并验证数据,然后将对象传递给K2进行进一步处理。K2 (以及它调用的其他组件)中包含的所有步骤都可以只处理类型为S的对象。但在K3中,我们最终需要知道S的实际类型。

EN

Stack Overflow用户

发布于 2020-06-18 16:27:16

是的,这是一个访问者模式。

参观者是

代码语言:javascript
运行
复制
interface K {
    void handle(A a);
    void handle(B b);
}

并由K1K2K3实现。

S需要的是一个带有实现的方法visit(K)

代码语言:javascript
运行
复制
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>,其内容类似于

代码语言:javascript
运行
复制
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

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62444663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档