访问者模式(Visitor)
毕业快两年了,以前没有写博客的习惯,这几天读了王垠的文章,其中提到了访问者模式,学了下别人分享的心得,分享下自己的理解,有什么错误还望指正。
参考链接:
http://www.cnblogs.com/fanzhidongyzby/archive/2012/12/14/2818809.html
访问者模式据说用的地方不多,读了几篇分享的文章都没弄明白访问者模式干嘛的,上面的链接讲的比较清楚,自己整理了下思路,重新写一下
应用场景:
假如有两个人需要进入工厂,但是人员1和人员2进入工厂的流程不同,那该怎么设计?一般我们会认为,要把每一步的流程都抽象出来,然后判断进入的是什么人员然后该怎么操作,这样每个人都要做判断。
例子:
Man* e = new ManA;
流程1(传入e):
{
if(e == ManA)
此人不熟,验证身份信息
else if(e == ManB)
熟人,不用验证
}
流程2(传入e):
{
...
}
由上面例子看出,每次有新的人员进入,都要设置人员在每个流程中该做什么,十分麻烦。
此时就能应用到访问者模式(终于知道为什么叫访问者模式了,是不是可以这么理解)
不多说,Talk is cheap. Show me the code
创建进入流程类
class Process
{
public:
virtual void CheckID(Visitor* v) = 0;
};
class ProcessStep1 : public Process
{
public:
virtual void CheckID(Visitor* v)
{
printf("第一次检查\n");
v->onProcessStep1(this);
}
};
class ProcessStep2 : public Process
{
public:
virtual void CheckID(Visitor* v)
{
printf("第二次检查\n");
v->onProcessStep2(this);
}
};
创建两种访问者
class Visitor
{
public:
virtual void onProcessStep1(ProcessStep1* p) = 0;
virtual void onProcessStep2(ProcessStep2* p) = 0;
};
class VisitorNormal : public Visitor
{
public:
virtual void onProcessStep1(ProcessStep1* p)
{
printf(" 我是普通人,被检查\n");
}
virtual void onProcessStep2(ProcessStep2* p)
{
printf(" 必须交会费\n");
}
};
class VisitorVIP : public Visitor
{
public:
virtual void onProcessStep1(ProcessStep1* p)
{
printf(" 我是VIP,不用检查\n");
}
virtual void onProcessStep2(ProcessStep2* p)
{
printf(" VIP不用交会费\n");
}
};
创建流程管理类
class ProcessManager
{
private:
std::list<Process*> m_list;
public:
ProcessManager()
{
m_list.push_back(new ProcessStep1);
m_list.push_back(new ProcessStep2);
}
void VisitorComeIn(Visitor* v)
{
std::list<Process*>::iterator it = m_list.begin();
for (; it != m_list.end(); it++)
{
(*it)->CheckID(v);
}
}
};
主函数
int main()
{
VisitorNormal nor;
VisitorVIP vip;
ProcessManager p;
p.VisitorComeIn(&nor);
p.VisitorComeIn(&vip);
return 0;
}
至此,对于访问者模式的个人理解就完成了。代码比较简单。以后有空会不定时更新一些c++和java的东西,可能比较肤浅,望指正