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