访问者模式是一种行为型设计模式,它允许你在不修改现有对象结构的情况下,定义新的操作算法。该模式通过将操作封装在访问者对象中,使得可以在不同对象上执行相同的操作,同时不破坏对象的封装性。
实现访问者模式
在C++中,实现访问者模式通常需要以下几个元素:
元素对象(Element)
元素对象是访问者模式中的被访问对象。可以是一个抽象类或接口,定义了接受访问者对象的方法。
class Element {
public:
virtual void accept(Visitor& visitor) = 0;
};
具体元素对象(ConcreteElement)
具体元素对象是元素对象的实现,实现了接受访问者对象的方法。
class ConcreteElement1 : public Element {
public:
void accept(Visitor& visitor) override {
visitor.visitConcreteElement1(*this);
}
};
class ConcreteElement2 : public Element {
public:
void accept(Visitor& visitor) override {
visitor.visitConcreteElement2(*this);
}
};
访问者对象(Visitor)
访问者对象是封装了操作算法的对象,可以定义多个不同的操作方法。
class Visitor {
public:
virtual void visitConcreteElement1(ConcreteElement1& element) = 0;
virtual void visitConcreteElement2(ConcreteElement2& element) = 0;
};
具体访问者对象(ConcreteVisitor)
具体访问者对象实现了访问者对象定义的操作方法。
class ConcreteVisitor : public Visitor {
public:
void visitConcreteElement1(ConcreteElement1& element) override {
// 执行操作算法1
}
void visitConcreteElement2(ConcreteElement2& element) override {
// 执行操作算法2
}
};
对象结构(ObjectStructure)
对象结构是元素对象的集合,可以是一个容器或集合类。
class ObjectStructure {
public:
void add(Element& element) {
elements.push_back(&element);
}
void accept(Visitor& visitor) {
for (Element* element : elements) {
element->accept(visitor);
}
}
private:
std::vector<Element*> elements;
};
应用访问者模式
使用访问者模式时,首先创建元素对象和访问者对象,然后将元素对象加入到对象结构中,最后调用对象结构的accept方法执行操作。
int main() {
ConcreteElement1 element1;
ConcreteElement2 element2;
ObjectStructure objectStructure;
objectStructure.add(element1);
objectStructure.add(element2);
ConcreteVisitor visitor;
objectStructure.accept(visitor);
return 0;
}
在上述示例中,具体访问者对象执行了不同的操作算法,具体元素对象根据其类型调用访问者对象的相应方法。
总结
访问者模式是一种非常强大的设计模式,可以在不修改现有对象结构的情况下,定义新的操作算法。这种模式适用于对象结构中的类很少发生变化,但经常需要在不同的对象上执行相同的操作的场景。通过将操作封装在访问者对象中,可以使得添加新的操作变得简单,同时不破坏对象的封装性。
本文来自极简博客,作者:深夜诗人,转载请注明原文链接:C++中的访问者模式:实现与应用