10 Visitor

Davids 2025-08-10 05:19:12
Categories: > > Tags:

访问器模式:

由于需求改变,类层次结构常需要增加新的行为,直接修改基类会增加子类负担。
在 不改变类层次结构 的前提下,运行时为各个类动态添加新的操作。
子类是需要先预知的。
能够修改的操作是有限的。

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
class Visitor;

class Abstract {
public:
virtual void AcceptVisitor(Visitor* visitor) = 0;
virtual ~Visitor();
};

class AbstractA : public Abstract {
public:
virtual void AcceptVisitor(Visitor* visitor) override {
visitor.ModifyAbstractA(*this);
}
};

class AbstractB : public Abstract {
public:
virtual void AcceptVisitor(Visitor* visitor) override {
visitor.ModifyAbstractB(*this);
}
};

class Visitor {
public:
// 所有的 abstract 子类都要穷举
virtual void ModifyAbstractA(AbstractA& a) = 0;
virtual void ModifyAbstractB(AbstractB& b) = 0;
};

class VisitorA {
public:
virtual void ModifyAbstractA(AbstractA& a) override
{
// do some change
}
virtual void ModifyAbstractB(AbstractB& b) override
{
// do some change
}
};