设计模式---访问者模式

51 阅读2分钟

定义

访问者模式(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;
}

image.png

总结

访问者模式的核心思想是将操作与数据结构分离,使得可以在不修改数据结构的情况下,添加新的操作。它包含访问者接口、具体访问者、元素接口、具体元素和对象结构等组成部分。通过这种模式,可以在系统中添加新的操作,而不需要改变元素类的代码。