程序案例:我只有数学语文两个作业本,但是谁都可以来看。
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 */
输出结果: