设计模式复习-访问者模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式复习-访问者模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
VisitorMode.h#pragma once
#include<list>
#include<string>
#include<iostream>
using namespace std;/*
設(shè)計(jì)模式-訪問(wèn)者模式(Visitor)
表示一個(gè)作用于某對(duì)象機(jī)構(gòu)中各元素的操作。它使你可以在不改變各元素的類(lèi)的前提下定義作用于
這些元素的新操作。
*/class CConcreteElementA;
class CConcreteElementB;class CVisitor {//為該對(duì)象結(jié)構(gòu)中ConcreteElement的每個(gè)類(lèi)聲明一個(gè)Visit操作。
public:virtual void VisitConcreteElementA(CConcreteElementA * pConcreteElementA) = 0;virtual void VisitConcreteElementB(CConcreteElementB * pConcreteElementB) = 0;
};class ConcreteVisitor1 :public CVisitor {//具體訪問(wèn)者類(lèi)
public:void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
};class ConcreteVisitor2 :public CVisitor {//具體訪問(wèn)者類(lèi)
public:void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
};class CElement {//定義一個(gè)Accept操作,它以一個(gè)訪問(wèn)者為參數(shù)
public:virtual void Accept(CVisitor *pVisitor) = 0;
};class CConcreteElementA :public CElement {
private:string mstrName;
public:CConcreteElementA(const string &strName);void Accept(CVisitor *pVisitor);void OperationA() {}//A的單獨(dú)方法string GetName();
};class CConcreteElementB :public CElement {
private:string mstrName;
public:CConcreteElementB(const string &strName);void Accept(CVisitor *pVisitor);void OperationB() {}//B的單獨(dú)方法string GetName();
};class CobjuctStructure {//定義一個(gè)高層接口,以允許訪問(wèn)者訪問(wèn)它的元素。
private:list<CElement*>mlElement;
public:CobjuctStructure();~CobjuctStructure();void Attach(CElement *pElement);void Eetach(CElement *pElement);void Accept(CVisitor *pVisitor);
};VisitorMode.cpp
#include "stdafx.h"
#include "VisitorMode.h"void ConcreteVisitor1::VisitConcreteElementA(CConcreteElementA * pConcreteElementA) {cout << "1-A:" << pConcreteElementA->GetName() << endl;
}
void ConcreteVisitor1::VisitConcreteElementB(CConcreteElementB * pConcreteElementB) {cout << "1-B:" << pConcreteElementB->GetName() << endl;
}void ConcreteVisitor2::VisitConcreteElementA(CConcreteElementA * pConcreteElementA) {cout << "2-A:" << pConcreteElementA->GetName() << endl;
}
void ConcreteVisitor2::VisitConcreteElementB(CConcreteElementB * pConcreteElementB) {cout << "2-B:" << pConcreteElementB->GetName() << endl;
}CConcreteElementA::CConcreteElementA(const string &strName) {mstrName = strName;}
void CConcreteElementA::Accept(CVisitor *pVisitor) {pVisitor->VisitConcreteElementA(this);
}
string CConcreteElementA::GetName() {return mstrName;
}CConcreteElementB::CConcreteElementB(const string &strName) {mstrName = strName;}
void CConcreteElementB::Accept(CVisitor *pVisitor) {pVisitor->VisitConcreteElementB(this);
}
string CConcreteElementB::GetName() {return mstrName;
}CobjuctStructure::CobjuctStructure() {mlElement.clear();
}
CobjuctStructure::~CobjuctStructure() {for each(CElement* index in mlElement) {delete index;}
}
void CobjuctStructure::Attach(CElement *pElement) {mlElement.push_back(pElement);
}
void CobjuctStructure::Eetach(CElement *pElement) {mlElement.remove(pElement);
}
void CobjuctStructure::Accept(CVisitor *pVisitor) {for each (CElement * index in mlElement) {index->Accept(pVisitor);}
}客戶端調(diào)用#include<string>
#include<iostream>
#include "VisitorMode.h"
using namespace std;int main() {CobjuctStructure *pO = new CobjuctStructure();pO->Attach(new CConcreteElementA("man"));pO->Attach(new CConcreteElementB("woman"));ConcreteVisitor1 *pV1 = new ConcreteVisitor1();ConcreteVisitor2 *pV2 = new ConcreteVisitor2();pO->Accept(pV1);pO->Accept(pV2);delete pO, delete pV1, delete pV2;getchar();return 0;
}
總結(jié)
以上是生活随笔為你收集整理的设计模式复习-访问者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设计模式复习-解释器模式
- 下一篇: 推荐算法-矩阵分解