比如有一個公園,有一到多個不同的組成部分;該公園存在多個訪問者:清潔工 A 負責打掃公園的 A 部分,清潔工 B 負責打掃公園的 B 部分,公園的管理者負責檢點各項事務是否完成,上級領導可以視察公園等等。也就是說,對于同一個公園,不同的訪問者有不同的行為操作,而且訪問者的種類也可能需要根據時間的推移而變化(行為的擴展性)。 根據軟件設計的開閉原則(對修改關閉,對擴展開放),實現需求。
//// Created by andrew on 2020/11/28.//#include<iostream>#include<list>usingnamespace std;classParkElement;classVisitor{public:virtual~Visitor()=default;virtualvoidvisit(ParkElement *parkElement)=0;};classParkElement{public:virtual~ParkElement()=default;virtualvoidaccept(Visitor *visitor)=0;};classParkA:public ParkElement{public:voidaccept(Visitor *v) override{// 公園接收訪問者, 讓訪問者操作v->visit(this);}};classParkB:public ParkElement{public:voidaccept(Visitor *v) override{v->visit(this);}};// 整個公園classPark: ParkElement {public:Park(){m_list.clear();}voidsetParkElement(ParkElement *pe){m_list.push_back(pe);}voidaccept(Visitor *v) override{for(auto it=m_list.begin();it!=m_list.end(); it++){(*it)->accept(v);}}private:list<ParkElement *>m_list;};classVisitorA:public Visitor{voidvisit(ParkElement *parkElement) override {cout <<"part A is clear"<< endl;}};classVisitorB:public Visitor {public:voidvisit(ParkElement *parkElement) override{cout <<"part B is clear"<< endl;}};classManagerVisitor:public Visitor {public:voidvisit(ParkElement * parkElement) override {cout <<"visit all part"<< endl;}};voidPartVisitor(){Visitor *vA =new VisitorA;Visitor *vB =new VisitorB;auto*parkA =new ParkA;auto*parkB =new ParkB;parkA->accept(vA);parkB->accept(vB);delete vA;delete vB;delete parkB;delete parkA;}voidManagerVisit(){Visitor *vManager =new ManagerVisitor;Park *park =new Park;ParkElement *parkA =new ParkA;ParkElement *parkB =new ParkB;park->setParkElement(parkA);park->setParkElement(parkB);// 整個公園接受管理員的訪問park->accept(vManager);delete parkA;delete parkB;delete park;delete vManager;}intmain(int argc,char* argv[]){PartVisitor();ManagerVisit();return0;}