设计模式笔记:访问者模式

访问者模式:作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作

在这个例子中,我们有两个具体的元素类ConcreteElementAConcreteElementB,以及两个具体的访问者类ConcreteVisitorAConcreteVisitorB。元素类有一个accept方法,用于接受访问者并执行相应的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <vector>

// Visitor interface
class Visitor {
public:
virtual void visit(ConcreteElementA& element) = 0;
virtual void visit(ConcreteElementB& element) = 0;
virtual ~Visitor() {}
};

// ConcreteVisitorA
class ConcreteVisitorA : public Visitor {
public:
void visit(ConcreteElementA& element) override {
std::cout << "ConcreteVisitorA visiting ConcreteElementA\n";
// 执行对ConcreteElementA的操作
}

void visit(ConcreteElementB& element) override {
std::cout << "ConcreteVisitorA visiting ConcreteElementB\n";
// 执行对ConcreteElementB的操作
}
};

// ConcreteVisitorB
class ConcreteVisitorB : public Visitor {
public:
void visit(ConcreteElementA& element) override {
std::cout << "ConcreteVisitorB visiting ConcreteElementA\n";
// 执行对ConcreteElementA的另一种操作
}

void visit(ConcreteElementB& element) override {
std::cout << "ConcreteVisitorB visiting ConcreteElementB\n";
// 执行对ConcreteElementB的另一种操作
}
};

// Element interface
class Element {
public:
virtual void accept(Visitor& visitor) = 0;
virtual ~Element() {}
};

// ConcreteElementA
class ConcreteElementA : public Element {
public:
void accept(Visitor& visitor) override {
visitor.visit(*this);
}
};

// ConcreteElementB
class ConcreteElementB : public Element {
public:
void accept(Visitor& visitor) override {
visitor.visit(*this);
}
};

// 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;
};

int main() {
ObjectStructure os;
os.add(new ConcreteElementA());
os.add(new ConcreteElementB());

ConcreteVisitorA visitorA;
os.accept(visitorA);

ConcreteVisitorB visitorB;
os.accept(visitorB);

// 清理内存(在实际应用中,可以使用智能指针来避免手动删除)
for (Element* element : os.elements) {
delete element;
}

return 0;
}