zoukankan      html  css  js  c++  java
  • 访问者模式 Vistor

    定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

    类型:行为类模式

    类图:

    结构对象中的元素类在accept的时候将自身作为参数 vistor类,Vistor类通过此参数获得一些相关信息。

    代码中:Person为Element抽象类

        Man WoMan为具体元素类

        ObjectStruct为结构对象类

        Action为Vistor抽象类

        AngryAction,SadAction为Vistor具体类

    // Vistor.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    class Person;            // 只是声明这是一个 class,有什么成员还不知道,只能定义指针类型 ICommand *
                             // 成员是没法访问的 
    
    class Action{               
    public:
        virtual void GetManAction(Person * ) = 0;
        virtual void GetWomenAction(Person *) = 0;
    };
    
    class Person{             //Action的具体类与Person的具体类中相互包含实用成员函数,将两者的抽象类放于所有具体类之前,可以编译通过
                            //更一般的情况,声明放前面,不要实现,因为之前只声明了另一个类,只能定义其指针,不能获取其成员函数
    public:
        Person(string name):m_name(name){}
        virtual void accept(Action * action) = 0;
        string getname(){
            return m_name;
        }
    private:
        string m_name;
    };
    
    class AngryAction:public Action{
    public:
        void GetManAction(Person * person){
            cout<<"男人("<<person->getname()<<"):大叫"<<endl;
        }
        void GetWomenAction(Person * person){
            cout<<"女人("<<person->getname()<<"):尖叫"<<endl;
        }
    };
    class SadAction:public Action{
    public:
        void GetManAction(Person * person){
            cout<<"男人("<<person->getname()<<"):喝酒"<<endl;
        }
        void GetWomenAction(Person * person){
            cout<<"女人("<<person->getname()<<"):哭泣"<<endl;
        }
    };
    
    
    
    class Man:public Person{
    public:
        Man(string name):Person(name){}
        void accept(Action * action){
            action->GetManAction(this);
        }
    };
    
    class WoMan:public Person{
    public:
        WoMan(string name):Person(name){}
        void accept(Action * action){
            action->GetWomenAction(this);
        }
    };
    
    class ObjectStruct{
    public:
        void Attach(Person *p){
            m_list.push_back(p);
        }
    
        void Detach(Person *p){
            m_list.remove(p);
        }
    
        void Accept(Action * paction){
            list<Person *>::iterator it ;
            for(it = m_list.begin();it != m_list.end();it++){
                (*it)->accept(paction);
            }
        }
    private:
        list<Person *> m_list;
    };
    
    int main(int argc,char * argv[]){
        
        ObjectStruct * pobstruct = new ObjectStruct;
        pobstruct->Attach(new Man("老王"));
        pobstruct->Attach(new WoMan("小红"));
    
        Action * paction1 = new AngryAction;
        pobstruct->Accept(paction1);
        Action * paction2 = new SadAction;
        pobstruct->Accept(paction2);
    
    }
  • 相关阅读:
    虚拟主机wordpress文件上传大小限制更改
    wordpress网站迁移
    JavaScript算法相关
    文章阅读(三)
    文章阅读(二)
    Image():强制让图片缓存起来
    JavaScript运算符与类型
    JavaScript权威指南--多媒体和图形编程
    JavaScript权威指南--脚本化HTTP
    JavaScript权威指南--事件处理
  • 原文地址:https://www.cnblogs.com/xiumukediao/p/4649705.html
Copyright © 2011-2022 走看看