← 模式

访问者

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class element_concrete_1; class element_concrete_2; class visitor { public: virtual void visit(element_concrete_1& el) = 0; virtual void visit(element_concrete_2& el) = 0; }; class visitor_concrete : public visitor { public: virtual void visit(element_concrete_1& el) override { // 对 el 执行操作 }; virtual void visit(element_concrete_2& el) override { // 对 el 执行操作 }; }; class element { public: virtual void accept(visitor& v) = 0; }; class element_concrete_1 : public element { public: virtual void accept(visitor& v) override { v.visit(*this); } }; class element_concrete_2 : public element { public: virtual void accept(visitor& v) override { v.visit(*this); } };

此模式采用 CC0 公共领域贡献 许可。

要求 c++98 或更新版本。

意图

将通用算法与它们操作的元素或结构分离。

描述

访问者模式允许在不修改操作对象的情况下实现通用算法,并支持针对每种对象类型执行不同的操作,而无需动态类型转换。

第26-30行定义的element类定义了一个接口,允许对象接受访问者。每个从element派生的类,例如第32-48行的类,都实现了accept函数,使其调用访问者上适当的visit函数。

访问者实现了visitor接口(第4-9行),代表要应用于element的算法。访问者接口为每种类型的element定义了visit重载。一个示例visitor第11-23行定义。

当一个visitor访问一个element时,会发生两次函数调用(一次是accept,一次是visit),最终调用的visit函数取决于elementvisitor的类型。这个过程被称为双重分派

element是更大结构的一部分时,访问者模式特别有用,在这种情况下,accept函数可以递归地调用自身遍历结构。

贡献者

  • Joseph Mansfield
  • Felix Gruber
  • Evert Timberg

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享