zoukankan      html  css  js  c++  java
  • C++设计模式之访问者模式

    简述

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

    代码实现:

    // Visitor.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<iostream>
    #include<string>
    #include <list>
    using namespace std;
    
    class ParkElement;
    class Visitor  //不同的访问者 访问公园完成不同的动作 
    {
    public:
        virtual void visit(ParkElement *park) = 0;
    };
    
    class ParkElement
    {
    public:
        virtual void accpet(Visitor *v) = 0;
    };
    
    class ParkA:public ParkElement
    {
    public:
        virtual void accpet(Visitor *v)
        {
            v->visit(this);
        }
    };
    
    class ParkB:public ParkElement
    {
    public:
        virtual void accpet(Visitor *v)
        {
            v->visit(this);
        }
    };
    
    class Park:public ParkElement //公园的部分可以进行集中管理
    {
    public:
        Park()
        {
            m_list.clear();
        }
        void SetPart(ParkElement *e)
        {
            m_list.push_back(e);
        }
        void accept(Visitor *v)
        {
            for(list<ParkElement*>::iterator it = m_list.begin();it != m_list.end();it++)
            {
                (*it)->accpet(v);
            }
        }
    private:
        list<ParkElement *> m_list;
    };
    
    class VisitorA : public Visitor//访问者A
    {
    public:
        virtual void visit(ParkElement *park){ 
            cout << "清洁工A 访问 公园A 部分,打扫卫生完毕" << endl;}
    };
    
    class VisitorB : public Visitor//访问者B
    {
    public:
        virtual void visit(ParkElement *park){ 
            cout << "清洁工B 访问 公园B 部分,打扫卫生完毕" << endl;}
    };
    
    class VisitorManager : public Visitor//访问者管理员
    {
    public:
        virtual void visit(ParkElement *park)
        { cout << "管理员 检查 此部分卫生情况" << endl;}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        cout<<"访问者模式"<<endl;
        VisitorA *visitorA = new VisitorA;//创建访问者A
        VisitorB *visitorB = new VisitorB;//创建访问者B
    
    
        ParkA *partA = new ParkA;//创建数据结构  A
        ParkB *partB = new ParkB;//创建数据结构  B
    
        partA->accpet(visitorA); 
        //公园接受访问者A访问 + 在这个函数中封装了visitorA去访问公园A部分
    
        partB->accpet(visitorB); //公园接受访问者B访问 + 在这个函数中封装了visitorA去访问公园B部分
    
        
        system("pause");
        return 0;
    }
  • 相关阅读:
    浅析 KMP
    【GOJ 3049】玩具
    较详细的gdb入门教程
    【GOJ 2963】记者
    【GOJ 2961】数数
    GF OIer's Talk 维护笔记
    Linux 中 UFW 的使用
    开源是什么?能吃吗?
    个人介绍
    NOIP2020 爆零记
  • 原文地址:https://www.cnblogs.com/wxmwanggood/p/9304643.html
Copyright © 2011-2022 走看看