c++ 行为型模式_访问者(Visitor)
1) 意图
表示一个作用于某对象结构中各元素的操作。它允许在不改变各个元素的类的前提下定义作用于这些元素的新操作
2) 结构
其中:
- Visitor为该对象结构中ConcreteElement的每个类声明一个Visit操作
- ConcreteVisitor实现每个有Visitor声明的操作
- Element定义以一个访问者为参数的Accept操作
- ConcreteElement实现上述Accept操作
3) 适用性
- 一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操作
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而又想要避免这些操作污染这些对象的类
- 定义对象的类很少改变,但经常需要在此结构上定义新的操作
4) 举例
1 #include <iostream> 2 class Visitor; 3 class Element 4 { 5 public: 6 Element() {} 7 virtual ~Element() {} 8 virtual void Accept(Visitor* pVisitor) = 0; 9 }; 10 11 class ConcreateElementA : public Element 12 { 13 public: 14 ConcreateElementA() {} 15 virtual ~ConcreateElementA() {} 16 void Accept(Visitor* pVisitor); 17 void OperationA() 18 { 19 std::cout << "OperationA" << std::endl; 20 } 21 }; 22 class ConcreateElementB : public Element 23 { 24 public: 25 ConcreateElementB() {} 26 virtual ~ConcreateElementB() {} 27 void Accept(Visitor* pVisitor); 28 void OperationB() 29 { 30 std::cout << "OperationB" << std::endl; 31 } 32 }; 33 class Visitor 34 { 35 public: 36 Visitor() {} 37 virtual ~Visitor() {} 38 virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA) = 0; 39 virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB) = 0; 40 }; 41 class ConcreateVisitor1:public Visitor 42 { 43 public: 44 ConcreateVisitor1() {} 45 virtual ~ConcreateVisitor1() {} 46 virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA) 47 { 48 std::cout << "ConcreateVisitor1" << std::endl; 49 pConcreateElementA->OperationA(); 50 } 51 virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB) 52 { 53 std::cout << "ConcreateVisitor1" << std::endl; 54 pConcreateElementB->OperationB(); 55 } 56 }; 57 class ConcreateVisitor2 :public Visitor 58 { 59 public: 60 ConcreateVisitor2() {} 61 virtual ~ConcreateVisitor2() {} 62 virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA) 63 { 64 std::cout << "ConcreateVisitor2" << std::endl; 65 pConcreateElementA->OperationA(); 66 } 67 virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB) 68 { 69 std::cout << "ConcreateVisitor2" << std::endl; 70 pConcreateElementB->OperationB(); 71 } 72 }; 73 void ConcreateElementA::Accept(Visitor* pVisitor) 74 { 75 pVisitor->VisitConcreateElementA(this); 76 } 77 void ConcreateElementB::Accept(Visitor* pVisitor) 78 { 79 pVisitor->VisitConcreateElementB(this); 80 } 81 82 int main() 83 { 84 Element* pElementA = new ConcreateElementA(); 85 Visitor* pVisitor1 = new ConcreateVisitor1(); 86 Visitor* pVisitor2 = new ConcreateVisitor2(); 87 pElementA->Accept(pVisitor1); 88 pElementA->Accept(pVisitor2); 89 system("pause"); 90 }