C++ 访问器模式(Visitor)

本文深入探讨了软件设计模式中的访问者模式,详细介绍了其工作原理、优缺点及适用场景,并通过C++代码示例展示了如何实现该模式。访问者模式能够有效应对需求变更,简化单元测试,但可能破坏原有封装性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Visitor 模式:将更新(变更)封装到一个类中(访问操作),并由待更改类提供一个接收接

优点

简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

缺点

破坏了封装性

使用场景

在开发和设计过程中经常会遇到一种情况就是需求变更,经常我们做好了一个系统原型,客户又有了新的需求。我们又因此不得不去修改已有的设计,其带来的后果就是设计根本就不可能封闭、编译永远都是整个系统代码。这种情况就可以使用访问器模式。

代码如下:


#include <iostream>
#include <string>
#include <memory>

class element; 
class visitor
{
public:
	virtual ~visitor(void){}
	virtual void visitor_element_fushi(element *elm) = 0;
	virtual void visitor_element_gougou(element *elm) = 0;
	virtual void visitor_element_siyao(element *elm) = 0;
};
class element 
{
public:  
	virtual ~element(){}
	virtual void accept(visitor* vis) = 0; 
};
//腐蚀
class fushi : public element
{
public:
	virtual void accept(visitor* vis)
	{
		vis->visitor_element_fushi(this);
	}
};
//钩子
class gougou : public element
{
public:
	virtual void accept(visitor* vis)
	{
		vis->visitor_element_gougou(this);
	}
};
//撕咬
class siyao : public element
{
public:
	virtual void accept(visitor* vis)
	{
		vis->visitor_element_siyao(this);
	}
};

class display_visitor : public visitor
{
public:
	virtual void visitor_element_fushi(element *elm)
	{
		std::cout << "visitor_element_fushi .." << std::endl;
	}
	virtual void visitor_element_gougou(element *elm)
	{
		std::cout << "visitor_element_gougou .." << std::endl;
	}
	virtual void visitor_element_siyao(element *elm)
	{
		std::cout << "visitor_element_siyao .." << std::endl;
	}
};
///////////////////////////////////////
int main()
{
	std::cout << "start-up .." << std::endl;
	
	display_visitor dv;
	gougou gg;
	gg.accept(&dv);
	
	std::cout << "done .." << std::endl;
    return 0;
}


运行如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值