访问者模式【行为模式C++】

这篇具有很好参考价值的文章主要介绍了访问者模式【行为模式C++】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

      访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。

      访问者模式主要解决的是数据与算法的耦合问题,尤其是在数据结构比较稳定,而算法多变的情况下。为了不污染数据本身,访问者会将多种算法独立归档,并在访问数据时根据数据类型自动切换到对应的算法,实现数据的自动响应机制,并确保算法的自由扩展。

       访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式。

访问者模式【行为模式C++】,设计模式,访问者模式

2.结构

访问者模式结构包括以下几个要素:

  • 抽象访问者(Visitor)角色:可以是接口或者抽象类,定义了一系列操作方法,用来处理所有数据元素,通常为同名的访问方法,并以数据元素类作为入参来确定那个重载方法被调用。
  • 具体访问者(ConcreteVisitor)角色:访问者接口的实现类,可以有多个实现,每个访问者都需要实现所有数据元素类型的访问重载方法。
  • 抽象元素(Element)角色:被访问的数据元素接口,定义了一个接受访问者的方法( accept ),其意义是指,每一个元素都要可以被访问者访问。
  • 具体元素(ConcreteElement)角色: 具体数据元素实现类,提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法,其accept实现方法中调用访问者并将自己 "this" 传回。
  • 客户端 ( Client ) : 使用容器并初始化其中各类数据元素,并选择合适的访问者处理容器中的所有数据对象。

访问者模式【行为模式C++】,设计模式,访问者模式

3.实现

3.1 实例类比

        假如有这样一位非常希望赢得新客户的资深保险代理人。 他可以拜访街区中的每栋楼, 尝试向每个路人推销保险。 所以, 根据大楼内组织类型的不同, 他可以提供专门的保单:

  • 如果建筑是居民楼, 他会推销医疗保险。
  • 如果建筑是银行, 他会推销失窃保险。

 访问者模式【行为模式C++】,设计模式,访问者模式 

3.2 实例引入

  访问者模式可以被用于实现 KPI(关键绩效指标)考核系统。在这个场景下,你可以将员工、团队等作为对象结构的元素,而不同的 KPI 考核指标(如工作绩效、创新能力、团队协作等)作为不同的访问者。这样,你就可以灵活地添加新的考核指标,而无需修改对象结构中的元素类。

3.3  结构分析

在这个案例中,代码中的各个结构可以对应到策略模式中的不同角色:

  • 抽象访问者(Visitor)角色:对应代码Visitor接口,用于处理所有员工数据元素。
  • 具体访问者(ConcreteVisitor)角色:对应代码KPIVisitor,访问者具体实现。
  • 抽象元素(Element)角色:对应代码Employee,定义了一个接受访问者的方法( accept ),便于每一个元素都要可以被访问者访问。
  • 具体元素(ConcreteElement)角色::对应代码Manager、Engineer, 具体员工数据元素实现类,提供接受访问方法的具体实现,通常情况下accept实现方法中调用访问者并将自己 "this" 传回。

类图如下:访问者模式【行为模式C++】,设计模式,访问者模式

3.4 具体实现
#include <iostream>
#include <string>
using namespace std;
// 元素接口:员工
// 访问者接口:KPI 考核
class Visitor;
class Engineer;
class Manager;

class Employee {
public:
	virtual void accept(Visitor* visitor) = 0;
};

class Visitor {
public:
	virtual void visit(Engineer* engineer) = 0;
	virtual void visit(Manager* manager) = 0;
};


// 具体元素类:工程师
class Engineer :public Employee {

public:
	void accept(Visitor* visitor) {
		visitor->visit(this);
	}

	// 工程师的特有方法
	void doCoding() {
		std::cout << "工程师正在编码..." << endl;
	}
};

// 具体元素类:项目经理
class Manager :public Employee {

public:
	void accept(Visitor* visitor) {
		visitor->visit(this);
	}

	// 经理的特有方法
	void manageTeam() {
		std::cout << "经理正在管理团队..." << endl;
	}
};

// 具体访问者类:KPI 考核实现
class KPIVisitor :public Visitor {
	
public:
	void visit(Engineer *engineer) {
		std::cout << "工程师的工作绩效考核中..." << endl;
		engineer->doCoding();  // 工程师的特有工作
	}
	
	void visit(Manager* manager) {
		std::cout << "项目经理的工作绩效考核中..." << endl;
		manager->manageTeam();  // 经理的特有工作
	}
};

// 客户端测试

 int main() 
 {
	Employee *engineer = new Engineer();
	Employee *manager = new Manager();

	Visitor *kpiVisitor = new KPIVisitor();

	// 对工程师进行 KPI 考核
	engineer->accept(kpiVisitor);

	// 对经理进行 KPI 考核
	manager->accept(kpiVisitor);
	return 0;
}
3.5 运行结果

访问者模式【行为模式C++】,设计模式,访问者模式

4.访问者模式优缺点

优点:

  • 扩展性好。在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
  • 复用性好。通过访问者来定义整个对象结构通用的功能,从而提高复用程度。
  • 分离无关行为。通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。

缺点:文章来源地址https://www.toymoban.com/news/detail-853661.html

  • 对象结构变化很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。
  • 违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。
  • 违反了单一职责原则。访问者模式将相关操作集中到访问者类中,可能导致该类承担过多的责任,违反单一职责原则。
  • 违反了开放封闭原则。如果系统中新增了一个元素类,所有的具体访问者类都需要修改,不符合开闭原则。

5.应用场景

  • 当对象的数据结构相对稳定,而操作却经常变化的时候。
  • 比如,编译器的语法树分析:编译器可以使用访问者模式来遍历语法树,对不同类型的节点执行不同的操作。
  • 需要将数据结构与不常用的操作进行分离的时候。
  • 比如,扫描文件内容这个动作通常不是文件常用的操作,但是对于文件夹和文件来说,和数据结构本身没有太大关系(树形结构的遍历操作),扫描是一个额外的动作,如果给每个文件都添加一个扫描操作会太过于重复,这时采用访问者模式是非常合适的,能够很好分离文件自身的遍历操作和外部的扫描操作。
  • 需要在运行时动态决定使用哪些对象和方法的时候。
  • 比如,对于监控系统来说,很多时候需要监控运行时的程序状态,但大多数时候又无法预知对象编译时的状态和参数,这时使用访问者模式就可以动态增加监控行为。

到了这里,关于访问者模式【行为模式C++】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景

    当谈到访问者模式时,我们可以通过以下方式进行详细解释: 访问者模式是一种行为型设计模式,它允许你在不修改已有代码的情况下,向现有对象结构添加新的操作。该模式将操作(或方法)封装在称为访问者的独立对象中,使得可以在不修改元素类的情况下,通过访问者

    2024年02月03日
    浏览(59)
  • 设计模式—访问者模式

     需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 如果此时再添加一个操作:找出新品上市的水果。 上述代码中,FruitMarket为应付新增操作,增加了相应的方法来满足要求,但这样破坏了FruitMarket的结构。 本质是将数据结构和数据操作分

    2024年02月10日
    浏览(60)
  • 设计模式——访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于在不修改现有类结构的前提下向对象结构添加新的操作。访问者模式通过定义一个访问者接口,使得可以在不改变元素类的情况下,为各个元素类增加新的功能。 元素接口(Element Interface): 定义了一个accept()方法

    2024年01月18日
    浏览(58)
  • 设计模式——19. 访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变元素类(被访问者)的前提下,定义对元素的新操作(访问者),并将这些操作封装到独立的访问者类中。这样,你可以在不修改被访问者的类的情况下,通过不同的访问者来执行不同的操作。 访问者模式

    2024年02月07日
    浏览(43)
  • 设计模式之访问者模式(上)

    访问者模式 1)概述 1.概念 访问者模式包含 访问者 和 被访问元素 两个主要组成部分。 处方单中的各种药品信息就是 被访问的元素 ,而划价人员和药房工作人员就是 访问者 ,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。 被访问元素

    2024年04月25日
    浏览(41)
  • Java设计模式-访问者模式

    在软件开发领域中,设计模式是解决常见问题的经典方法。其中,访问者模式是一种强大且灵活的设计模式,用于处理对象结构中的元素,并根据不同的访问者实现不同的操作。 访问者模式是一种行为型设计模式,它允许你在不改变元素类的前提下定义新的操作。该模式将算

    2024年02月06日
    浏览(54)
  • js设计模式:访问者模式

    将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。

    2024年02月22日
    浏览(72)
  • 设计模式之访问者模式(下)

    3)访问者模式与组合模式联用 1.概述 在访问者模式中,包含一个用于存储元素对象集合的对象结构,可以使用迭代器来遍历对象结构,同时具体元素之间可以存在整体与部分关系,有些元素作为容器对象,有些元素作为成员对象,可以使用组合模式来组织元素。 2.结构图

    2024年04月25日
    浏览(47)
  • 03-JAVA设计模式-访问者模式

    访问者模式(Visitor Pattern)是软件设计模式中的一种行为模式,它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中,我们定义了两个主要角色: 访问者(Visitor): 这个接口声明了一个访问元

    2024年04月29日
    浏览(47)
  • 设计模式(二十三)访问者

    表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式 访问者模式是一种较为复杂的行为型模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素

    2024年02月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包