避免下行广播,双重调度



我做了类似于以下代码的事情:

void launchPipeline(IQueryFactory & queryFactory, IQuerySender &querySender, IValidateResponse &responseValidator)
{
std::unique_ptr<IQuery> query = queryFactory.getInstance();
/*
auto a,b,c = querySender.send(query);
//we just get a lot of params from that function
*/
if(responseValidator.validate(query, a, b, c)
{
//do something
}
}
class IValidateResponse
{
public:
virtual bool validate(IQuery & query, int a, int b, int c) = 0;
};
class QueryAValidator
{
public:
bool validate(IQuery & query, int a, int b, int c) override
{
const auto & queryA = dynamic_cast<const QueryA &>(query);
//do something
}
};

它工作得很好,因为IQueryFactoryIValidateResponse的匹配类型被注入。但我想知道是否可以用某种奇特的方式避免这种情况?

我在考虑QueryVisitor,但我不确定如何实现它,访问函数需要使用a、b、c参数,这在IQuery接口上看起来很奇怪,比如query.accept(visitor, a, b, c)

或者我可以将这些param存储在访问者中,但这仍然感觉不顺利,尤其是在编写测试时。现在我称之为";验证器测试";我只是简单地放置假响应并测试具体的Validator类,向其中添加访问者会使它们更加复杂。

你将如何解决这个问题?

在IQuery中定义一个纯虚拟函数,并将其称为foo(int a,int b,int c(。在QueryA中,您用您用"定义的代码覆盖foo//做某事;在动态铸造之后。用query.foo(a,b,c(替换动态强制转换

最新更新