访问者模式:使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。
通俗来说就是:不同的人对同一件事情有着不同的处理方式。
访问者模式是一种行为型的软件设计模式,表示一个作用于某对象结构中的各元素的操作。使得在不改变各元素类的前提下,能定义作用于这些元素的操作。
该模式适合数据结构相对稳定且算法又易变化的系统。
数据结构是被访问者,算法操作相当于访问者。
访问者模式的优点:
良好扩展性。扩展对元素的操作,只需要添加访问者。
满足单一职责原则。相关的操作封装为一个访问者,使得访问者职责单一。
解耦。数据结构自身和作用于它的操作解耦合。
访问者模式的缺点:
不易增加元素类。每增加一个元素类,访问者的接口和实现都要进行变化。
违背了依赖倒置原则。访问者依赖的是具体元素而不是抽象元素。
破坏封装。访问者可以获取被访问元素的细节。
案例:
对于同一家公司或者学校,不同的人去访问的目的和处理方式不同。
类图:
实现如下:
place.h:
#ifndef PLACE_H
#define PLACE_H
#include <iostream>
#include <string>
using namespace std;
class Place {
public:
string getName()
{
return m_name;
}
virtual void accept() = 0;
protected:
string m_name;
};
class School : public Place {
public:
School(string name)
{
m_name = name;
}
virtual void accept() override
{
cout << m_name << "学校被访问" << endl;
}
};
class Enterprice : public Place {
public:
Enterprice(string name)
{
m_name = name;
}
virtual void accept() override
{
cout << m_name << "公司被访问" << endl;
}
};
#endif // PLACE_H
visitor.h:
#ifndef VISITOR_H
#define VISITOR_H
#include "place.h"
class Visitor {
public:
virtual void visitSchool(Place* place) = 0;
virtual void visitEnterprice(Place* place) = 0;
virtual void handle() = 0;
};
class Mayor : public Visitor {
public:
virtual void visitSchool(Place* place) override
{
place->accept();
handle();
}
virtual void visitEnterprice(Place* place) override
{
place->accept();
handle();
}
virtual void handle() override
{
cout << "市长检查,进行一系列处理" << endl;
}
};
class Parents : public Visitor {
public:
virtual void visitSchool(Place* place) override
{
place->accept();
handle();
}
virtual void visitEnterprice(Place* place) override
{
place->accept();
handle();
}
virtual void handle() override
{
cout << "家长参观,进行一系列处理" << endl;
}
};
#endif // VISITOR_H
main.cpp:
/*
* 访问者模式
*
* date:2023-9-21
*/
#include "visitor.h"
int main()
{
Place* school = new School("CQNU");
Visitor* mayor = new Mayor();
Visitor* parents = new Parents();
mayor->visitSchool(school);
puts("");
parents->visitSchool(school);
}
运行截图: