访问者模式C++实现
1定义Visitor Pattern
封装一些作用于某种数据结构中各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素新的操作
2类图
角色分析
Visitor抽象访问者,声明可以访问哪些元素,具体到程序中就是Visit方法参数定义哪些对象可以被访问
ConcreteVisitor,他影响访问者访问到一个类之后该怎么做
Element抽象元素,声明哪一个类访问者访问,程序上通过accept方法中的参数定义
ConcreteElement实现accept方法,visitor.visit(this)基本形成一种模式
ObjectStrture结构对象,元素产生者,一般容纳多个不同类,不同接口的容器,如list,set,map,在项目中一般很少抽象这个角色
3实现
class Element
{
protected:
Element();
public:
void doSomething();
void accept(Ivisitor visitor) = 0;
virtual ~Element() = 0;
};
class ConcreteElement
{
public:
void doSomething();
void accept(IVisitor visitor)
{
visitor.visit(*this);
}
};
class IVisitor
{
public:
void Visitor(ConcreteElent el);
};
class Visitor:public IVisitor
{
public:
void visit(Concrete el)
{
el.doSomething();
}
};
//结构体对象
class ObjectStuture
{
public:
static Element createElement()
{
Random rand = new Random();
return new ConcreteElement();
}
};
4应用
①优点
单一职责,Elementz子类加载数据,Visitor负责报表展示
优秀的扩展性,增加数据操作是很方便的
灵活性高,可以实现Element提供数据,Visitor对数据进行修饰并呈现
②缺点
具体元素对访问者公布细节
具体元素变更困难,因为要同时变更Visitor
违背依赖倒置原则,访问者依赖具体元素而不是抽象元素
③使用场景
一个对象结构包含很多类对象,他们接口不同,而你需要对其是实施的具体操作依赖具体类.迭代器模式不能胜任
需要对一个结构体中的对象进行很多不同且不相关的操作,且不想操作 污染对象的类。
::业务规则要求遍历多个不同的对象,与迭代器模式对比。
同时访问者模式也可以充当拦截器角色,在混编模式中
5扩展
①统计功能
将数据统计和批处理通过访问者模式进行处理
②多个访问者