← 模式
访问者
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | class 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
函数取决于element
和visitor
的类型。这个过程被称为双重分派。
当element
是更大结构的一部分时,访问者模式特别有用,在这种情况下,accept
函数可以递归地调用自身遍历结构。