初学设计模式之访问者模式

程序案例:我只有数学语文两个作业本,但是谁都可以来看。

  1 /***********************************************************************************************
  2 -————————————————————— 程序案例 ——————————————————————
  3 小时候上学作业本就两种,数学作业本和语文作业本,但是自己要写它                                  
  4 老师要批阅它,家长要检查它,有时候亲朋好友来了还要看一下
  5 总的来说,作业本就两本,但是访问它的却很多,可能还要拓展
  6 
  7 ————————————————————— 案例分析——————————————————————
  8 小学作业只有数学和语文两种,相当于数据固定不变;不同的人去访问它,相当于对数据的操作,这个是变化
  9 的,可能是老师也可能是家长,而且不同人访问它对他的操作是不同的;有时候亲朋好友来了还要看一下相当于
 10 在数学作业和语文作业不变化的情况下,增加了对数据的操作方法,用于程序的后期维护
 11 
 12 ——————————————————————核心思想————————————————————
 13                       访问者模式就可以在不修改数据的情况下,增加对数据操作的操作方法
 14 
 15 ——————————————————————角色分工——————————————————————
 16       抽象访问者(抽象Visitor类)
 17       具体访问者(Visitor派生出的老师访问类和父母访问类)
 18       抽象元素(作业抽象类)
 19       具体元素(作业类派生出的数学作业和语文作业)
 20       对象结构(列表成员变量用来存储元素)
 21       访问者模式就可以在不修改数据的情下,增加对数据操作的操作方法
 22 ************************************************************************************************/
 23 #include<iostream>
 24 #include<list>
 25 using namespace std;
 26 
 27 class Visitor
 28 {
 29 public:
 30     virtual void VisitMathHomework(){cout<<"111"<<endl;};
 31     virtual void VisitChineseHomework(){};
 32 };
 33 
 34 class TeacherVisitor:public Visitor
 35 {
 36 public:
 37     void VisitMathHomework()
 38     {
 39         cout<<"老师审阅数学作业90分"<<endl;
 40     }
 41     void VisitChineseHomework()
 42     {
 43         cout<<"老师审阅语文作业100分"<<endl;
 44     }
 45 };
 46 
 47 class ParentVisitor:public Visitor
 48 {
 49 public:
 50     void VisitMathHomework()
 51     {
 52         cout<<"家长检查数学作业"<<endl;
 53     }
 54     void VisitChineseHomework()
 55     {
 56         cout<<"家长检查语文作业"<<endl;
 57     }
 58 };
 59 
 60 class Homework
 61 {
 62 public:
 63     virtual void accept(Visitor *m_abstractVisitor){};
 64 };
 65 
 66 class MathHomework:public Homework
 67 {
 68 public:
 69     void accept(Visitor *m_abstractVisitor)
 70     {
 71         m_abstractVisitor->VisitMathHomework();
 72     };
 73 };
 74 
 75 class ChinesehHomework:public Homework
 76 {
 77 public:
 78     void accept(Visitor *m_abstractVisitor)
 79     {
 80         m_abstractVisitor->VisitChineseHomework();
 81     };
 82 };
 83 
 84 class ObjectStructure
 85 {
 86 private:
 87     list<Homework*>elementsList;
 88 public:
 89     void addElement(Homework* m_homework)
 90     {
 91         elementsList.push_back(m_homework);
 92     }
 93     void display(Visitor *m_abstractVisitor)
 94     {
 95         for(std::list<Homework*> ::iterator iter=elementsList.begin();iter!=elementsList.end();iter++)
 96         {
 97             (*iter)->accept(m_abstractVisitor);
 98         }
 99     }
100 };
101 
102 int main()
103 {    ObjectStructure m_objectStructure;
104     m_objectStructure.addElement(new MathHomework);
105     m_objectStructure.addElement(new ChinesehHomework);
106 
107     //老师访问
108     TeacherVisitor *m_teacherVisitor=new TeacherVisitor;
109     m_objectStructure.display(m_teacherVisitor);
110 
111 
112     //家长访问
113     ParentVisitor *m_parentVisitor=new ParentVisitor;
114     m_objectStructure.display(m_parentVisitor);
115 
116     getchar();
117     return 0;
118 };
119 
120 
121 
122 /*
123  参考网址与图书:
124 https://www.cnblogs.com/chenssy/p/3339756.html   对访问者模式关于角色的描述
125 《大话设计模式》
126 
127 
128 */

输出结果:

猜你喜欢

转载自www.cnblogs.com/wuhongjian/p/11566767.html