c++ 行为型模式_访问者(Visitor)

1) 意图

表示一个作用于某对象结构中各元素的操作。它允许在不改变各个元素的类的前提下定义作用于这些元素的新操作

2) 结构

 c++ 行为型模式_访问者(Visitor)

 

 其中:

  1. Visitor为该对象结构中ConcreteElement的每个类声明一个Visit操作
  2. ConcreteVisitor实现每个有Visitor声明的操作
  3. Element定义以一个访问者为参数的Accept操作
  4. ConcreteElement实现上述Accept操作

 3) 适用性

  1. 一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操作
  2. 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而又想要避免这些操作污染这些对象的类
  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 }

 

原文链接: https://www.cnblogs.com/ho966/p/12245771.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++ 行为型模式_访问者(Visitor)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/326160

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:42
下一篇 2023年3月1日 下午3:42

相关推荐