首页 > 代码库 > 访问者模式

访问者模式

一、简介

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 }

 

访问者模式