首页 > 代码库 > 访问者模式
访问者模式
一、简介
1、访问者模式表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
2、模式中的成员角色
访问者(Visitor) :访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。
具体访问者(ConcreteVisitor):访问者的具体实现类。
元素(Element),也就是被访问者,通过accept(Visitor)方法接受Visitor的访问。
具体元素(ConcreteElement) 元素的具体实现类。
对象结构(ObjectStructure) 拥有一组元素的组合对象。ObjectStructure本身也可以作为被访问者。
二、C++程序
1 // 访问者模式.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<string> 7 #include<list> 8 using namespace std; 9 //被访问者类声明 10 class Person; 11 //访问者类声明 12 class Visiter ; 13 //public: 14 //virtual void print_sproter(Person *)=0; 15 //virtual void print_judgement(Person *)=0; 16 17 //被访问者抽象类 18 class Person 19 { 20 public: 21 Person(){} 22 virtual ~Person(){} 23 virtual string getname()=0; 24 virtual string getNo()=0; 25 virtual void accept(Visiter *)=0; 26 }; 27 //访问者抽象类 28 class Visiter 29 { 30 public: 31 Visiter(){} 32 virtual ~Visiter(){} 33 virtual void print_sproter(Person *)=0; 34 virtual void print_judgement(Person *)=0; 35 }; 36 //具体的被访问者1 37 class Sporter :public Person 38 { 39 private: 40 string name;//姓名 41 string No; //编号 42 public: 43 Sporter(string n,string N) 44 { 45 name=n; 46 No=N; 47 } 48 virtual~Sporter(){} 49 virtual void accept(Visiter *visiter) 50 { 51 visiter->print_sproter(this); 52 } 53 virtual string getname() 54 { 55 return name; 56 } 57 virtual string getNo() 58 { 59 return No; 60 } 61 }; 62 //具体的被访问者2 63 class Judgement :public Person 64 { 65 private: 66 string name;//姓名 67 public: 68 Judgement(string n) 69 { 70 name=n; 71 } 72 virtual~Judgement(){} 73 virtual void accept(Visiter *visiter) 74 { 75 visiter->print_judgement(this); 76 } 77 virtual string getname() 78 { 79 return name; 80 } 81 virtual string getNo() 82 { 83 return 0; 84 } 85 }; 86 87 //具体的访问者类 88 class Concretevisitor:public Visiter 89 { 90 public: 91 Concretevisitor(){} 92 virtual ~Concretevisitor(){} 93 virtual void print_sproter(Person *people) 94 { 95 cout<<"运动员"<<endl; 96 cout<<"name:"<<people->getname()<<endl; 97 cout<<"No:"<<people->getNo()<<endl; 98 } 99 virtual void print_judgement(Person *people)100 {101 cout<<"裁判"<<endl;102 cout<<"name:"<<people->getname()<<endl;103 }104 };105 106 //被访问者的具体对象结构107 class Objectstructure108 {109 private:110 list<Person*> persons;111 public:112 Objectstructure(){}113 ~Objectstructure(){}114 void add(Person* people)115 {116 persons.push_back(people);117 }118 void remove(Person* people)119 {120 persons.remove(people);121 }122 void accept(Visiter* visiter)123 {124 list<Person*>::iterator it=persons.begin();125 for(;it!=persons.end();it++)126 {127 (*it)->accept(visiter);128 }129 }130 };131 132 int _tmain(int argc, _TCHAR* argv[])133 {134 Objectstructure* yundonghui=new Objectstructure();//新建一个运动会的对象结构135 Sporter * zhangsan=new Sporter("张三","0001");136 Sporter * lisi=new Sporter("李四","0002");137 Sporter * wangwu=new Sporter("王五","0003");138 Judgement* liu=new Judgement("刘裁判");139 yundonghui->add(zhangsan);140 yundonghui->add(lisi);141 yundonghui->add(wangwu);142 yundonghui->add(liu);143 144 Concretevisitor *notify=new Concretevisitor();145 146 cout<<"比赛即将开始,请下列运动员和裁判到检录台检录:"<<endl;147 yundonghui->accept(notify);148 return 0;149 }
访问者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。