DesignPattern/24.VisitorPattern/2.Code/Demo.h

67 lines
1.1 KiB
C
Raw Permalink Normal View History

2019-11-10 14:59:08 +00:00
#ifndef __DEMO_H__
#define __DEMO_H__
2021-10-28 15:15:51 +00:00
// 抽象访问者 Visitor
2019-11-10 14:59:08 +00:00
class Visitor
{
public:
virtual ~Visitor() {}
2021-10-28 15:15:51 +00:00
virtual void visit(ConcreteElementA *) = 0;
virtual void visit(ConcreteElementB *) = 0;
2019-11-10 14:59:08 +00:00
};
2021-10-28 15:15:51 +00:00
// 具体访问者 ConcreteVisitor
class ConcreteVisitor : public Visitor
2019-11-10 14:59:08 +00:00
{
public:
2021-10-28 15:15:51 +00:00
// 实现一种针对特定元素的访问操作
void visit(ConcreteElementA *)
{
// 元素A的访问操作代码
2019-11-10 14:59:08 +00:00
}
2021-10-28 15:15:51 +00:00
void visit(ConcreteElementB *)
{
// 元素A的访问操作代码
2019-11-10 14:59:08 +00:00
}
};
2021-10-28 15:15:51 +00:00
// 抽象元素
2019-11-10 14:59:08 +00:00
class Element
{
public:
virtual ~Element() {}
2021-10-28 15:15:51 +00:00
// 声明抽象方法,以一个抽象访问者的指针作为函数参数
virtual void accept(Visitor *) = 0;
2019-11-10 14:59:08 +00:00
};
2021-10-28 15:15:51 +00:00
// 具体元素
class ConcreteElement : public Element
2019-11-10 14:59:08 +00:00
{
public:
2021-10-28 15:15:51 +00:00
void accept(Visitor *visitor)
{
2019-11-10 14:59:08 +00:00
visitor->visit(this);
}
};
2021-10-28 15:15:51 +00:00
// 对象结构
2019-11-10 14:59:08 +00:00
class ObjectStructure
{
public:
2021-10-28 15:15:51 +00:00
// 提供接口接受访问者访问
void accept(Visitor *visitor)
{
// 遍历访问对象结构中的元素
for ()
{
2019-11-10 14:59:08 +00:00
elementList[i]->accept(visitor);
}
}
2021-10-28 15:15:51 +00:00
void addElement() {}
void removeElement() {}
2019-11-10 14:59:08 +00:00
private:
2021-10-28 15:15:51 +00:00
list<Element *> elementList;
2019-11-10 14:59:08 +00:00
};
#endif