首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多参数的访问者模式

具有多参数的访问者模式
EN

Stack Overflow用户
提问于 2014-07-31 07:30:04
回答 2查看 3.1K关注 0票数 2

是否可以实现访问者模式,以便:

  1. 接受者可以使用多个访问者。
  2. 当新增访客时,接受者不得改变。
  3. 访问者可能不得不接受参数,并且不同访问者之间的参数的数量和类型不同。

一个示例是可以对形状执行的形状层次结构类和操作。如果操作不需要接收任何参数,则每个操作都可以是访问者并从visitor类继承,并且每个形状都将实现accept方法:

代码语言:javascript
运行
复制
void SomeShape::accept(Visitor* visitor)
{
    visitor->visit(*this);
}

但是,在每个访问者需要接收额外的参数时,是否有一种方法可以使用访问者模式?有什么好的选择吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-31 08:13:57

您需要将附加参数存储在访问者本身中。它们通常在构造函数中传递。这被称为具体化(“使之成为现实”):本来应该是带有参数的函数调用现在是一个对象,表示函数调用,并存储参数。现在您可以在不查看内部的情况下传递这个对象,这就是我们想要的。

您的accept函数应该使用一个Visitor const&,以便您可以将它传递给临时函数,这很方便:

代码语言:javascript
运行
复制
pShape->accept(SnapToPoint(x, y));

SnapToPoint类将如下所示:

代码语言:javascript
运行
复制
struct SnapToPoint : Visitor {
    SnapToPoint(float x, float y) : _point(x, y) {}

    void visit(Circle   &c) const override { /* Use _point on c */ }
    void visit(Triangle &t) const override { /* Use _point on t */ }
    void visit(Square   &s) const override { /* Use _point on s */ }

private:
    Point _point;
};

编辑:响应下面的依赖注入需求的,是访问者工厂的一个示例:

代码语言:javascript
运行
复制
struct ShapeOperationFactory {
    virtual std::unique_ptr<Visitor> snapToPoint(float x, float y) const = 0;
};

struct MyShapeOpFactory : ShapeOperationFactory {
    std::unique_ptr<Visitor> snapToPoint(float x, float y) const override {
        return std::unique_ptr<Visitor>(new SnapToPoint(x, y));
    }
};

这会被称为:

代码语言:javascript
运行
复制
ShapeOperationFactory *pFactory = /* Get a factory */;
pShape->accept(pFactory->snapToPoint(4.0f, 7.0f));

看到它在运行这里。注意,这次我不得不使用Visitor实例,因为工厂是通用的。

编辑2:刷新了我关于临时生命的记忆。我将accept函数回滚到接受Visitor const&,参见结果这里

票数 7
EN

Stack Overflow用户

发布于 2014-07-31 07:39:32

你在做决定。

在访问者模式中无法实现您所要求的,如果是的话,它将不会有更多的访问者模式,因为它的主要职责是定义一组函数来执行数据堆,保持足够高的抽象程度,以避免在Acceptor中进行具体的类型识别。

您可能仍然需要这样的内容:例如,您可以在访问者本身中保留一些状态变量/(Unions),因此在它上执行accept将根据具体Visitor实例的内部状态产生不同的结果。

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

https://stackoverflow.com/questions/25053125

复制
相关文章

相似问题

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