C++访问者模式:Visitor Pattern

访问者模式:使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。


通俗来说就是:不同的人对同一件事情有着不同的处理方式。

访问者模式是一种行为型的软件设计模式,表示一个作用于某对象结构中的各元素的操作。使得在不改变各元素类的前提下,能定义作用于这些元素的操作。

该模式适合数据结构相对稳定且算法又易变化的系统。

数据结构是被访问者,算法操作相当于访问者。

访问者模式的优点:

    良好扩展性。扩展对元素的操作,只需要添加访问者。
    满足单一职责原则。相关的操作封装为一个访问者,使得访问者职责单一。
    解耦。数据结构自身和作用于它的操作解耦合。

访问者模式的缺点:

    不易增加元素类。每增加一个元素类,访问者的接口和实现都要进行变化。
    违背了依赖倒置原则。访问者依赖的是具体元素而不是抽象元素。
    破坏封装。访问者可以获取被访问元素的细节。
 

案例:

 对于同一家公司或者学校,不同的人去访问的目的和处理方式不同。

类图:

实现如下:

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);
}

运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值