简介
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;
}
运行如下: