C++设计模式-访问者模式
生活随笔
收集整理的這篇文章主要介紹了
C++设计模式-访问者模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
?
?
基本概念
代碼與實例
?
基本概念
訪問者模式(Visitor):表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變元素的類的前提下定義作用于這些元素的新操作。
UML圖如下(此圖來源于大話設(shè)計模式)
訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對穩(wěn)定的系統(tǒng)。
訪問者模式的優(yōu)點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關(guān)行為集中到一個訪問者對象中。
?
代碼與實例
程序運(yùn)行截圖如下:
源碼如下:
Head.h
#ifndef HEAD_H #define HEAD_H#include <iostream> #include <string> #include <list> #include <algorithm> using namespace std;class ConcreteElementA; class ConcreteElementB;//Visitor類,為該對象結(jié)構(gòu)中ConcreteElement的每一個類聲明一個Visit操作 class Visitor{public:virtual void visitConcreteElementA(ConcreteElementA *concreteElementA) = 0;virtual void visitConcreteElementB(ConcreteElementB *concreteElementB) = 0;virtual ~Visitor(); };//ConcreteVisitor1和ConcreteVisitor2類,具體訪問者,實現(xiàn)每一個由Visitor聲明的操作。 //每一個操作實現(xiàn)算法的一部分,而該算法片斷仍是對應(yīng)于結(jié)構(gòu)中對象的類。 class ConcreteVisitor1: public Visitor{public:void visitConcreteElementA(ConcreteElementA *concreteElementA);void visitConcreteElementB(ConcreteElementB *concreteElementB);~ConcreteVisitor1();string getName();void setName(const string &name);private:string m_name; };class ConcreteVisitor2: public Visitor{public:void visitConcreteElementA(ConcreteElementA *concreteElementA);void visitConcreteElementB(ConcreteElementB *concreteElementB);~ConcreteVisitor2();string getName();void setName(const string &name);private:string m_name; };//Element類,定義一個Accept操作,它以一個訪問者為參數(shù) class Element{public:virtual void accept(Visitor *visitor) = 0;virtual ~Element(); };//ConcreteElementA和ConcreteElementB類,具體元素,實現(xiàn)Accept操作 class ConcreteElementA: public Element{public:ConcreteElementA(string name);void accept(Visitor *visitor);/*下面還可能有其他的方法*/~ConcreteElementA();string getName();void setName(const string &name);private:string m_name; };class ConcreteElementB: public Element{public:ConcreteElementB(string name);void accept(Visitor *visitor);/*下面還可能有其他的方法*/~ConcreteElementB();string getName();void setName(const string &name);private:string m_name; };class ObjectStructure{public:void attach(Element *element);void detach(Element *element);void accpet(Visitor *visitor);~ObjectStructure(); private:list<Element*> m_list; };#endifHead.cpp
#include "Head.h"Visitor::~Visitor() {cout << "Visitor::~Visitor()" << endl; }void ConcreteVisitor1::visitConcreteElementA(ConcreteElementA *concreteElementA) {cout << concreteElementA->getName() << " 被 " << this->getName() << "訪問!" << endl; }void ConcreteVisitor1::visitConcreteElementB(ConcreteElementB *concreteElementB) {cout << concreteElementB->getName() << " 被 " << this->getName() << "訪問!" << endl; }ConcreteVisitor1::~ConcreteVisitor1() {cout << "ConcreteVisitor1::~ConcreteVisitor1()" << endl; }std::string ConcreteVisitor1::getName() {return m_name; }void ConcreteVisitor1::setName(const string &name) {m_name = name; }void ConcreteVisitor2::visitConcreteElementA(ConcreteElementA *concreteElementA) {cout << concreteElementA->getName() << " 被 " << this->getName() << "訪問!" << endl; }void ConcreteVisitor2::visitConcreteElementB(ConcreteElementB *concreteElementB) {cout << concreteElementB->getName() << " 被 " << this->getName() << "訪問!" << endl; }ConcreteVisitor2::~ConcreteVisitor2() {cout << "ConcreteVisitor2::~ConcreteVisitor2()" << endl; }std::string ConcreteVisitor2::getName() {return m_name; }void ConcreteVisitor2::setName(const string &name) {m_name = name; }Element::~Element() {cout << "Element::~Element()" << endl; }ConcreteElementA::ConcreteElementA(string name) {m_name = name; }void ConcreteElementA::accept(Visitor *visitor) {visitor->visitConcreteElementA(this); }ConcreteElementA::~ConcreteElementA() {cout << "ConcreteElementA::~ConcreteElementA()" << endl; }std::string ConcreteElementA::getName() {return m_name; }void ConcreteElementA::setName(const string &name) {m_name = name; }ConcreteElementB::ConcreteElementB(string name) {m_name = name; }void ConcreteElementB::accept(Visitor *visitor) {visitor->visitConcreteElementB(this); }ConcreteElementB::~ConcreteElementB() {cout << "ConcreteElementB::~ConcreteElementB()" << endl; }std::string ConcreteElementB::getName() {return m_name; }void ConcreteElementB::setName(const string &name) {m_name = name; }void ObjectStructure::attach(Element *element) {m_list.push_back(element); }void ObjectStructure::detach(Element *element) {m_list.remove(element); }void ObjectStructure::accpet(Visitor *visitor) {for(list<Element*>::iterator it = m_list.begin(); it != m_list.end(); it++){(*it)->accept(visitor);} }ObjectStructure::~ObjectStructure() {cout << "ObjectStructure::~ObjectStructure()" << endl;for(list<Element*>::iterator it = m_list.begin(); it != m_list.end(); it++){delete (*it);}m_list.clear(); }main.cpp
#include "Head.h"int main(int *argc, int *argv[]){ObjectStructure *o = new ObjectStructure;o->attach(new ConcreteElementA("呵呵"));o->attach(new ConcreteElementB("哈哈"));ConcreteVisitor1 *v1 = new ConcreteVisitor1;v1->setName("哦哦");ConcreteVisitor2 *v2 = new ConcreteVisitor2;v2->setName("嗷嗷");o->accpet(v1);o->accpet(v2);delete o;delete v1;delete v2;getchar();return 0; }?
總結(jié)
以上是生活随笔為你收集整理的C++设计模式-访问者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记|Qt工作笔记-setu
- 下一篇: Maven工作笔记-在内网环境下开发Sp