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;
    }
  • 相关阅读:
    SimpleITK学习(二)图像读取
    SimpleITK学习(一)基本概念
    pydicom读取dicom文件报错
    【Python】模拟登录上海西南某高校校园网 (jaccount)
    Leetcode 5
    【C++】枚举类型及其用法
    Leetcode 617 合并二叉树
    【端口转发】如何在外面访问家里的内网计算机?
    Python字典列表字段重组形成新的字典
    Android使用JDBC连接数据库
  • 原文地址:https://www.cnblogs.com/wxmwanggood/p/9304643.html
Copyright © 2011-2022 走看看