访问者设计模式

访问者设计模式

1.在”element“里面添加一个accept(Visitor)方法

2、创建一个”visitor”基类 ,并且为每一个”element创建一个visit()方法。

3、创建一个visitor的派生类然后执行相应的”elements”操作。

4、客户端创建”visitor”对象并且根据传入的类型来调用 相应的accept();

 

 

//

//  main.cpp

//  visitor_Design_pattern

//

//  Created by apple on 15/5/24.

//  Copyright (c) 2015年 apple. All rights reserved.

//

 

#include <iostream>

#include <string>

using namespace std;

//1、在"element"类中添加一个accept(visitor)方法

class Element{

public:

    virtual void accept(class Visitor &v)=0;

};

class This: public Element

{

public:

    /*虚函数*/void accept(Visitor &v);

    string thiss()

    {

        return "This";

    }

};

class That:public Element{

public:

    /*虚函数*/ void accept(Visitor &v);

    string that(){

        return "That";

    }

};

class TheOther:public Element{

public:

   /*虚函数*/  void accept(Visitor &v);

    string theOther(){

        return "TheOther";

    }

};

//2.创建 一个Vistor的基类,根据"element“的类型来执行相应的visit()方法

class Visitor{

public:

    virtual void visit(This *e)=0;

    virtual void visit(That *e)=0;

    virtual void visit(TheOther *e)=0;

};

void This::accept(Visitor &v){

    v.visit(this);

}

void That::accept(Visitor &v)

{

    v.visit(this);

}

 

void TheOther::accept(Visitor &v)

{

    v.visit(this);

}

//3、创建一个"visitor"派生类来实现具体的"elements”的操作

class upVisitor:public Visitor{

    void visit(This *e)

    {

        cout<<"do up on"+e->thiss()<<'\n';

    }

    void visit(That *e)

    {

        cout<<"do up on"+e->that()<<'\n';

    }void visit(TheOther *e)

    {

        cout<<"do up on"+e->theOther()<<'\n';

    }

};

class DownVisitor:public Visitor{

    void visit(This *e)

    {

        cout<<"do down on"+e->thiss()<<'\n';

    }

    void visit(That *e)

    {

        cout<<"do down on"+e->that()<<'\n';

    }void visit(TheOther *e)

    {

        cout<<"do down on"+e->theOther()<<'\n';

    }

};

int main(int argc, const char * argv[]) {

    Element *list[]={

        new This(),new That(),new TheOther()

    };

    upVisitor up;//客户端创建

    DownVisitor down;

    for (int i=0; i<3; i++)

        list[i]->accept(up);

    for (int i=0; i<3; i++) {

        list[i]->accept(down);

    }

   

}

 

posted @ 2015-05-24 11:30  夜风雪  阅读(248)  评论(0编辑  收藏  举报