C++多对象传递回调设计方案建议:禁止中间对象调用回调
解决X通过Y传递回调给Z但阻止Y调用的设计方案
方案一:封装型回调代理
X创建一个回调代理对象,将真正的业务回调逻辑包裹在内部,仅开放需要Z专属凭证才能触发的调用接口。Y仅能拿到这个代理对象,由于无法获取Z的专属凭证,无法触发代理内的真正回调。
以你的场景为例:
- Web Interface(X)实现一个
DBCallbackProxy类,内部持有自己的业务回调函数(比如处理请求结果的逻辑)。 DBCallbackProxy的执行方法(比如invoke())需要接收Database(Z)专属的校验参数(比如Z实例的唯一标识、或Z生成的临时token),只有参数匹配时才会调用内部的真正回调。- Dispatcher(Y)仅负责将
DBCallbackProxy转发给Database(Z),Y没有渠道获取Z的专属校验参数,自然无法触发回调。
方案二:回调与Z的上下文绑定
让回调函数的执行逻辑依赖Z的内部上下文状态,脱离Z的上下文则无法正常执行。
具体实现方式:
- X生成回调函数时,通过闭包绑定一个仅Z能生成的校验值(比如Z的私有成员哈希、或Z初始化时生成的唯一密钥)。
- 回调函数内部先校验当前调用方是否持有该校验值,只有校验通过才执行业务逻辑。
- 当Z接收回调后,将自身的校验值传入回调,触发正常执行;Y尝试调用时,无法提供合法校验值,回调直接忽略执行。
对应场景:Database(Z)在初始化时生成一个私有密钥,传递给回调时将密钥作为参数传入,Web Interface的回调逻辑只有在密钥匹配时才处理结果,Dispatcher(Y)不知道这个密钥,调用无效。
方案三:轻量权限控制中间件
在回调传递链路中加入一个独立的权限控制组件,专门负责校验回调的调用方身份。
操作逻辑:
- X创建回调时,同时向权限组件注册规则:仅允许Z的身份标识触发该回调。
- Y将回调和权限组件一起转发给Z,Z调用回调前,权限组件会自动校验调用方身份,通过则执行回调;Y若尝试调用,身份校验失败,回调不执行。
- 这个中间件不需要X和Z互相持有引用,仅需要Z能提供自己的身份标识完成校验即可。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

