首页 > 其他分享 >行为型模式-访问者模式

行为型模式-访问者模式

时间:2023-11-14 22:11:24浏览次数:29  
标签:Visitor employees 模式 employee Employee 数据结构 行为 访问者

1 什么是访问者模式

访问者模式(Visitor Pattern)是一种行为型设计模式,它允许在不改变数据结构的前提下定义作用于数据结构元素的新操作。使用访问者模式,可以将数据结构和数据操作相分离,从而使得数据结构的修改和数据操作的增加变得更加容易。

在访问者模式中,包括以下几个核心角色:

  • Visitor(访问者):定义了对数据结构中各个元素进行访问的操作接口,每个操作对应一个具体的访问者实现。
  • ConcreteVisitor(具体访问者):实现了Visitor接口中定义的各个操作,负责对数据结构中各个元素的具体访问操作。
  • Element(元素):定义了一个 accept 方法,该方法接收一个访问者作为参数,根据访问者的不同调用对应的 visit 方法。
  • ConcreteElement(具体元素):实现了Element接口,具体的数据元素类,包含了 accept 方法的具体实现。
  • ObjectStructure(对象结构):表示数据结构,负责容纳元素对象,并提供接口让访问者对象访问元素。

2 举个例子

下面以一个简单的员工数据结构和访问者模式为例来说明。

#include <iostream>
#include <vector>
#include <string>

// 前向声明员工类
class Employee;

// 访问者接口
class Visitor {
public:
    virtual void visit(Employee& employee) = 0;
    virtual ~Visitor() {}
};

// 具体访问者类:人力资源部访问者
class HRVisitor : public Visitor {
public:
    virtual void visit(Employee& employee) override {
        std::cout << "人力资源部正在处理员工:" << employee.getName() << std::endl;
    }
};

// 具体访问者类:财务部访问者
class FinanceVisitor : public Visitor {
public:
    virtual void visit(Employee& employee) override {
        std::cout << "财务部正在处理员工:" << employee.getName() << std::endl;
    }
};

// 元素接口
class Element {
public:
    virtual void accept(Visitor& visitor) = 0;
    virtual ~Element() {}
};

// 具体元素类:员工类
class Employee : public Element {
private:
    std::string name;

public:
    Employee(const std::string& name) : name(name) {}

    std::string getName() const {
        return name;
    }

    virtual void accept(Visitor& visitor) override {
        visitor.visit(*this);
    }
};

// 对象结构类:员工列表
class Employees {
private:
    std::vector<Employee> employees;

public:
    void attach(const Employee& employee) {
        employees.push_back(employee);
    }

    void detach(int index) {
        employees.erase(employees.begin() + index);
    }

    void accept(Visitor& visitor) {
        for (Employee& employee : employees) {
            employee.accept(visitor);
        }
    }
};

// 客户端代码
int main() {
    Employees employees;
    employees.attach(Employee("张三"));
    employees.attach(Employee("李四"));

    HRVisitor hrVisitor;
    FinanceVisitor financeVisitor;

    std::cout << "人力资源部正在处理员工:" << std::endl;
    employees.accept(hrVisitor);

    std::cout << "财务部正在处理员工:" << std::endl;
    employees.accept(financeVisitor);

    return 0;
}

在上面的示例中,我们首先定义了Visitor接口和两个具体访问者类HRVisitor和FinanceVisitor,它们分别用于处理员工信息。然后我们定义了Employee类作为具体元素类,实现了Element接口的accept方法用以接受访问者的访问。Employees类作为对象结构类,用来存储员工信息并提供统一的接口给访问者访问。

在客户端代码中,我们创建了两个具体访问者hrVisitor和financeVisitor,然后通过employees的accept方法分别将它们应用到员工列表中的每一个员工上,从而实现了不同部门对员工的处理操作。

3 总结

通过访问者模式,我们可以轻松地扩展对数据结构的操作,而无需改变现有的数据结构和数据元素类,使得算法的实现和数据结构的变化可以相互独立,并且易于扩展。

标签:Visitor,employees,模式,employee,Employee,数据结构,行为,访问者
From: https://www.cnblogs.com/luoxiang/p/17832718.html

相关文章

  • 行为型模式-状态模式
    1什么是状态模式状态模式(StatePattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变它的行为。状态模式通过将对象的状态封装成独立的类,使得对象在不同状态下可以有不同的行为,同时使状态转换更加简洁和可控。在状态模式中,包括以下几个核心角色:Context(上下文):定义客......
  • 2024版链动模式开发系统之商品专区解析
      链动2+1模式系统商城的商品专区解析,会员购买专区分为分享专区和精品专区,他们的不同之处在于分享专区的产品,分享专区有激活邀请码的产品,有1元购买产品成为体验会员的优惠产品,在链动2+1模式商城系统里被邀请注册的会员,初始身份是普通会员级别,普通会员没有分享邀请推广的功能。......
  • 设计模式实验12实验13
    外观模式 packagetest12;publicclassMemory{publicvoidcheck(){System.out.println("内存自检");}}packagetest12;publicclassHardDisk{publicvoidread(){System.out.println("硬盘读取");}}packa......
  • 软件设计模式学习每日总结-第二天
    回顾第一天:昨天学习的设计模式中的uml类图,还记得类与类的关系有关联(聚合、组合),依赖,继承,实现,其中依赖的耦合度最小,而继承的耦合度最大,而软件设计追求的就是高内聚,低耦合。还学习各种软件设计原则。第二天创建型模式:将创建和使用分离,使用者不需要关注创建的细节。简单工厂模式:......
  • Unity-观察者模式(observer)
    Unity-观察者模式(observer)引言​ 了解完委托(delegate)与事件(event)之后,我们来讨论一个问题。​ 假设我们有一个热水器,我们给他同上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你温度;2、液晶屏也会改变水温的显示,来提示水已经烧开了​ 现在我们需要写一个程序来模拟这个......
  • Unity-单例模式
    Unity-单例模式前言​ 对于某些特殊的类,我们希望在整个程序的生命周期只创建一个该类的对象,或是希望在其他类没有持有该类的引用,就可以调用该类中的函数,我们就需要将这个类写成单例模式单例的简单实现publicclassTest(){ pubicabstractTestInstance;//创建程序中该......
  • pgsql 查询对应模式下的表结构语句
    selecttable_name,column_name,data_type,udt_name,table_catalog,table_schema,table_name,column_name,ordinal_position,column_defaultfrominformation_schema.columnswheretable_schema='{schema}'andtab......
  • 活动报名 | 数字外贸私享会: 新商机、新模式、新政策,助企业实现弯道超车
    你是否觉得:投入了很多,拓客难度却越来越大?大单来了不敢接?风险不可控物流运输成本高,订单利润越来越低?客户账期长,回款难回款慢,企业资金压力大?“双碳”国策下,不知如何应对?数字时代下,外贸企业仅靠邮件、线下、传统等模式难以突破困局,业务增长缓慢,只有主动出击,借助数字运营模式不断完善获......
  • 学习随笔(设计模式:装饰模式)
    内容今天学习了新的设计模式,装饰模式。装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。收获1.当我们在设计软件时,考虑使用基类和派生类的时候,就可以考虑是否可以使用装饰模式,因为装饰模式比生成子类更加灵活2.当我们对一个已有的类添......
  • ChatGPT、GPT-4 Turbo接口调用(stream模式)
    接口地址https://chat.xutongbao.top/api/light/chat/createChatCompletion请求方式post请求参数model可选值:“gpt-3.5-turbo-1106”、“gpt-3.5-turbo-16k”、“gpt-4”、“gpt-4-1106-preview”。默认值为:“gpt-3.5-turbo-1106”token获取方式:访问:https://chat.xutongbao.to......