C++ 访问器模式(Visitor)

简介

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


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


版权声明:本文为u013078823原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。