定义
访问者模式(Visitor Pattern)是一种行为型设计模式,主要用于将操作与数据结构分离,使得可以在不改变数据结构的情况下,添加新的操作。访问者模式允许你在不修改数据结构的情况下,定义对结构中的每个元素的操作。
结构
-
访问者接口(Visitor Interface) :声明了对不同类型元素的
visit方法。 -
具体访问者(Concrete Visitor) :实现了对不同类型元素的具体操作。
-
元素接口(Element Interface) :定义了
accept方法,使访问者能够访问元素。 -
具体元素(Concrete Elements) :实现了
accept方法,允许访问者访问元素。 -
对象结构(Object Structure) :管理和提供访问者访问的元素集合,并允许遍历这些元素。
代码示例
#include <iostream>
#include <vector>
// 前向声明
class ElementA;
class ElementB;
// 访问者接口
class Visitor
{
public:
virtual ~Visitor() = default;
virtual void visit(ElementA& element) = 0;
virtual void visit(ElementB& element) = 0;
};
// 具体访问者1
class ConcreteVisitor1 : public Visitor
{
void visit(ElementA& element) override
{
std::cout << "Visitor1 is Visiting ElementA" << std::endl;
}
void visit(ElementB& element) override
{
std::cout << "Visitor1 is Visiting ElementB" << std::endl;
}
};
// 具体访问者2
class ConcreteVisitor2 : public Visitor
{
void visit(ElementA& element) override
{
std::cout << "Visitor2 is Visiting ElementA" << std::endl;
}
void visit(ElementB& element) override
{
std::cout << "Visitor2 is Visiting ElementB" << std::endl;
}
};
// 元素接口
class Element
{
public:
virtual ~Element() = default;
virtual void accept(Visitor& visitor) = 0;
};
// 具体元素A
class ElementA : public Element
{
public:
void accept(Visitor& visitor) override
{
visitor.visit(*this);
}
};
// 具体元素B
class ElementB : public Element
{
public:
void accept(Visitor& visitor) override
{
visitor.visit(*this);
}
};
// 对象结构
class ObjectStructure
{
private:
std::vector<std::shared_ptr<Element>> elements;
public:
void addElement(std::shared_ptr<Element> element)
{
elements.push_back(element);
}
void accept(Visitor& visitor)
{
for (auto& e : elements)
{
e->accept(visitor);
}
}
};
int main()
{
// 创建对象结构
ObjectStructure os;
os.addElement(std::make_shared<ElementA>());
os.addElement(std::make_shared<ElementB>());
// 创建访问者
ConcreteVisitor1 v1;
ConcreteVisitor2 v2;
// 访问者访问对象结构
os.accept(v1);
os.accept(v2);
system("pause");
return 0;
}
总结
访问者模式的核心思想是将操作与数据结构分离,使得可以在不修改数据结构的情况下,添加新的操作。它包含访问者接口、具体访问者、元素接口、具体元素和对象结构等组成部分。通过这种模式,可以在系统中添加新的操作,而不需要改变元素类的代码。