访问者设计模式:Visitor能否返回Promise?是否需新建接口?
访问者模式中修改Visitor返回类型的解决方案
结论:必须创建新的接口,原因和可行方案如下:
- 访问者模式的核心是通过统一的Visitor接口定义访问契约,其中
visit方法的返回类型是契约的关键部分。原有接口规定返回类型为T,所有实现类必须严格遵循这一约定。 - 当你需要某个Visitor返回
Promise<T>时,这已经打破了原有契约:同步的T和异步的Promise<T>是完全不同的类型,强类型语言中会直接编译失败,弱类型语言也会导致调用方的处理逻辑混乱(比如不知道是直接取值还是要处理异步回调)。
可行的实现方案:
定义异步Visitor接口
- 新建一个
AsyncVisitor接口,将其中visit方法的返回类型声明为Promise<T>,让需要异步返回的Visitor实现这个新接口。 - 原有返回
T的Visitor继续保留在原Visitor接口下,这样两种Visitor各司其职,调用方可以根据场景明确选择同步或异步的实现,逻辑更清晰。
- 新建一个
全量改造原有接口为异步(仅适合全局异步化场景)
- 如果你的系统正在全面转向异步架构,所有Visitor都可以改为异步返回,那么可以直接修改原有接口的返回类型为
Promise<T>。但这种方式会迫使原本同步的Visitor也需要把返回值包装成Promise(比如Promise.resolve(同步结果)),增加了不必要的复杂度,非必要不推荐。
- 如果你的系统正在全面转向异步架构,所有Visitor都可以改为异步返回,那么可以直接修改原有接口的返回类型为
内容的提问来源于stack exchange,提问作者Lana James
相关产品推荐
相关产品推荐

