• 访问者模式


    一、简介

    1、访问者模式表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

    2、模式中的成员角色

    访问者(Visitor)   :访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。
    具体访问者(ConcreteVisitor):访问者的具体实现类。
    元素(Element),也就是被访问者,通过accept(Visitor)方法接受Visitor的访问。
    具体元素(ConcreteElement)   元素的具体实现类。
    对象结构(ObjectStructure)  拥有一组元素的组合对象。ObjectStructure本身也可以作为被访问者。

    3、UML

    4、所属类别:行为型

    二、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 Objectstructure
    108 {
    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 }
  • 相关阅读:
    java javax.annotation.Resource注解的详解
    Struts2注解详解
    HDU 5074-Hatsune Miku(DP)
    Mac下配置Cocos2d-x3.1环境
    POJ 2109 Power of Cryptography
    Swift编程语言学习10—— 枚举属性监视器
    解决:Determining IP Information for eth0 一直停留 无法进入系统
    Bootstrap之表格
    创建和关联内容数据库到指定Web应用程序和站点集
    Ucan23操作系统项目地址
  • 原文地址:https://www.cnblogs.com/bewolf/p/4265846.html
Copyright © 2020-2023  润新知