大话设计模式28----访问者模式

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:16   2690   0

大话设计模式


1 访问者模式(Visitor)结构图




2 对访问者模式的一些解释


概念:表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。【DP】


访问者模式适用于数据结构相对稳定的系统
是的。它把数据结构和作用于数据结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据机构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。反之,如果这样的系统的数据结构对象易于变化,经常要有新的数据对象增加进来,就不适合使用访问者模式。

优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

缺点其实也就是使得增加新的数据结构变得困难了。

GoF四人中的一人说过:“大多数时候你并不需要访问者模式,但当一旦你需要访问者模式时,那就是真的需要它了”。

3 C++源代码实现


3.1 代码结构图



3.2 源代码


Person.h
#ifndef _PERSON_H_
#define _PERSON_H_

class State;

class Person
{
public:
 virtual void Accept(State* visitor){};
};

class Man :public Person
{
 void Accept(State* visitor);
};

class Woman :public Person
{
 void Accept(State* visitor);
};

#endif

Person.cpp
#include"Person.h"
#include"State.h"

void Man::Accept(State* visitor)
{
 visitor->GetManConclusion(this);
}

void Woman::Accept(State* visitor)
{
 visitor->GetWomanConclusion(this);
}

State.h
#ifndef _STATE_H_
#define _STATE_H

class Person;

class State
{
public:
 virtual void GetManConclusion(Person* concreteElementA){};
 virtual void GetWomanConclusion(Person* concreteElementB){};
};

class Success :public State
{
public:
 void GetManConclusion(Person* concreteElementA) override;
 void GetWomanConclusion(Person* concreteElementB) override;;
};

class Failing :public State
{
public:
 void GetManConclusion(Person* concreteElementA) override;
 void GetWomanConclusion(Person* concreteElementB) override;
};

class Amativeness :public State
{
public:
 void GetManConclusion(Person* concreteElementA) override;
 void GetWomanConclusion(Person* concreteElementB) override;
};
#endif

State.cpp
#include "Person.h"
#include"State.h"
#include <iostream>
#include <string>

void Success::GetManConclusion(Person* concreteElementA)
{
 std::cout << typeid(*concreteElementA).name() << " " << typeid(*this).name() << " " << "时,背后多半有一个伟大的女人。" << std::endl;
}

void Success::GetWomanConclusion(Person* concreteElementA)
{
 std::cout << typeid(*concreteElementA).name() << " " << typeid(*this).name() << " " << "时,背后多半有一个不成功的男人。" << std::endl;
}

void Failing::GetManConclusion(Person* concreteElementA)
{
 std::cout << typeid(*concreteElementA).name() << " " << typeid(*this).name() << " " << "时,闷头喝酒,谁也不用劝。" << std::endl;
}

void Failing::GetWomanConclusion(Person* concreteElementA)
{
 std::cout << typeid(*concreteElementA).name() << " " << typeid(*this).name() << " " << "时,眼泪汪汪,谁也劝不了。" << std::endl;
}

void Amativeness::GetManConclusion(Person* concreteElementA)
{
 std::cout << typeid(*concreteElementA).name() << " " << typeid(*this).name() << " " << "时,凡事不懂也要装懂。" << std::endl;
}

void Amativeness::GetWomanConclusion(Person* concreteElementA)
{
 std::cout << typeid(*concreteElementA).name() << " " << typeid(*this).name() << " " << "时,遇事懂也装作不懂。" << std::endl;
}

ObjectStructure.h
#ifndef _OBJECTSTRUCTURE_H_
#define _OBJECTSTRUCTURE_H_

#include"Person.h"
#include"State.h"
#include <vector>
#include <string>
#include <iostream>

class ObjectStructure
{
private:
 std::vector<Person*> elements;
public:
 ObjectStructure(){}
 ~ObjectStructure();

 void Attach(Person*);
 void Detach(Person*);
 void Display(State*);
};

#endif

ObjectStructure.cpp
#include "ObjectStructure.h"
#include <iterator>

ObjectStructure::~ObjectStructure()
{
 std::vector<Person* >::iterator it;
 for (it = elements.begin(); it != elements.end(); it++)
  delete *it;
}

void ObjectStructure::Attach(Person* element)
{
 elements.push_back(element);
}

void ObjectStructure::Detach(Person* element){}

void ObjectStructure::Display(State* visitor)
{
 std::vector<Person* >::iterator it;
 for (it = elements.begin(); it != elements.end(); it++)
  (*it)->Accept(visitor);
}

客户端Client.cpp
#include "ObjectStructure.h"
#include <iostream>
#include <cstdlib>

void main()
{
 ObjectStructure o;

 o.Attach(new Man());
 o.Attach(new Woman());

 Success v1;
 o.Display(&v1);

 Failing v2;
 o.Display(&v2);

 Amativeness v3;
 o.Display(&v3);

 system("pause");
}

运行结果:
class Man class Success 时,背后多半有一个伟大的女人。
class Woman class Success 时,背后多半有一个不成功的男人。
class Man class Failing 时,闷头喝酒,谁也不用劝。
class Woman class Failing 时,眼泪汪汪,谁也劝不了。
class Man class Amativeness 时,凡事不懂也要装懂。
class Woman class Amativeness 时,遇事懂也装作不懂。
请按任意键继续. . .




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP