定义:访问者模式(Visitor Pattern)是一种行为设计模式,它允许你将数据操作与数据结构分离。这个模式适用于数据结构相对稳定,但对其操作易于变化的情况。通过将操作封装在访问者类中,你可以在不修改数据结构的情况下增加新的操作。
结构:
Visitor(访问者):定义一个或多个访问操作,这些操作应用于访问对象结构中的元素。
ConcreteVisitor(具体访问者):实现每个访问操作,这些操作对数据结构中的元素执行具体操作。
Element(元素):定义一个接受访问者对象的操作,这个操作通常是 accept 方法。
ConcreteElement(具体元素):实现 accept 方法,该方法接收一个访问者对象作为参数。
ObjectStructure(对象结构):能够枚举其所有元素,并可以允许访问者访问这些元素。通常是一个集合,如列表或树。
// Element 接口
class Element {
public:
virtual ~Element() = default;
virtual void accept(std::shared_ptr<class Visitor> visitor) = 0;
virtual void doSomething() = 0;
};
// Visitor 接口
class Visitor {
public:
virtual ~Visitor() = default;
virtual void visit(std::shared_ptr<Element> element) = 0;
};
// ConcreteVisitorA 类
class ConcreteVisitorA : public Visitor {
public:
void visit(std::shared_ptr<Element> element) override {
element->doSomething();
std::cout << "ConcreteVisitorA visiting ConcreteElementA." << std::endl;
}
};
// ConcreteVisitorB 类
class ConcreteVisitorB : public Visitor {
public:
void visit(std::shared_ptr<Element> element) override {
element->doSomething();
std::cout << "ConcreteVisitorB visiting ConcreteElementB." << std::endl;
}
};
// ConcreteElementA 类
class ConcreteElementA : public Element ,public std::enable_shared_from_this<ConcreteElementA>{
public:
void accept(std::shared_ptr<Visitor> visitor) override {
visitor->visit(std::dynamic_pointer_cast<Element>(shared_from_this()));
}
void doSomething() {
std::cout << "ConcreteElementA doing something." << std::endl;
}
};
// ConcreteElementB 类
class ConcreteElementB : public Element ,public std::enable_shared_from_this<ConcreteElementB>{
public:
void accept(std::shared_ptr<Visitor> visitor) override {
visitor->visit(std::dynamic_pointer_cast<Element>(shared_from_this()));
}
void doSomething() override{
std::cout << "ConcreteElementB doing something." << std::endl;
}
};
// ObjectStructure 类
class ObjectStructure {
private:
std::vector<std::shared_ptr<Element>> elements;
public:
void addElement(std::shared_ptr<Element> element) {
elements.push_back(element);
}
void accept(std::shared_ptr<Visitor> visitor) {
for (auto& element : elements) {
element->accept(visitor);
}
}
};
int main() {
// 创建对象结构并添加元素
ObjectStructure os;
os.addElement(std::make_shared<ConcreteElementA>());
os.addElement(std::make_shared<ConcreteElementB>());
// 创建访问者并访问对象结构
std::shared_ptr<Visitor> visitorA = std::make_shared<ConcreteVisitorA>();
os.accept(visitorA);
std::shared_ptr<Visitor> visitorB = std::make_shared<ConcreteVisitorB>();
os.accept(visitorB);
return 0;
}