訪問者設計模式
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);
}
}