• 设计模式复习-访问者模式


    VisitorMode.h
    
    #pragma once
    #include<list>
    #include<string>
    #include<iostream>
    using namespace std;
    
    /*
    设计模式-访问者模式(Visitor)
    表示一个作用于某对象机构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于
    这些元素的新操作。
    */
    
    class CConcreteElementA;
    class CConcreteElementB;
    
    class CVisitor {//为该对象结构中ConcreteElement的每个类声明一个Visit操作。
    public:
    	virtual void VisitConcreteElementA(CConcreteElementA * pConcreteElementA) = 0;
    	virtual void VisitConcreteElementB(CConcreteElementB * pConcreteElementB) = 0;
    };
    
    class ConcreteVisitor1 :public CVisitor {//具体访问者类
    public:
    	void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);
    	void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
    };
    
    class ConcreteVisitor2 :public CVisitor {//具体访问者类
    public:
    	void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);
    	void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
    };
    
    class CElement {//定义一个Accept操作,它以一个访问者为参数
    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的单独方法
    	string GetName();
    };
    
    class CConcreteElementB :public CElement {
    private:
    	string mstrName;
    public:
    	CConcreteElementB(const string &strName);
    	void Accept(CVisitor *pVisitor);
    	void OperationB() {}//B的单独方法
    	string GetName();
    };
    
    class CobjuctStructure {//定义一个高层接口,以允许访问者访问它的元素。
    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);
    	}
    }
    
    客户端调用
    
    #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;
    }

  • 相关阅读:
    软件开发过程须贯彻评估和测试
    【灌水】多维成功论
    改进c系列(目录)
    网站管理艺术
    .net 跨平台也是一句谎言
    用户界面和逻辑应该分离
    设计模式
    程序员找不到工作是因为管理差
    编码阶段
    保证软件开发质量的一种管理学
  • 原文地址:https://www.cnblogs.com/csnd/p/12061903.html
Copyright © 2020-2023  润新知