C++ 访问者模式
C++ 访问者模式
访问者模式有社么作用?
我至今没遇到过使用访问者模式的工程级C++代码,但是从日常生活上却是一种常见的考虑问题的思路:
举个例子对比一下
参观别人家的公司的两种方式:
1 访问者模式:你(参观者)想要参观一家公司(被参观的对象),需要门禁卡才能进入,需要注册一张临时卡(C++中,就相当于注册到公司对象,注册进去,再把公司对象的this指针传入自己的功能函数中)),然后开始参观(调用公司类开放的接口,如GetValue之类的)。
2 组合模式:买下来这家公司成为老板(持有公司对象),自然可以参观各个部门,调用任何功能函数,那就没啥可讲的了,全是你的。
访问者模式代码举例
被访问的类
class Company
{
regist(vister *person)
{
person->lookcompany(this);
}
getValue()
{
cout<<"office security message"<<endl;
}
}
访问者
class vister
{
void lookCompany(company* office)
{
cout<<"关掉监控"//访问者自己的功能
office->getvalue();//调用公司类内部的功能
}
}
应用场景
-
工程上会用到吗?
我能想到的就是,你想临时给公司类加一个功能,这个功能主要是由访问者带来的,同时也会使用到公司类自有的功能,就用这个模式;
此外,类B中的有个注册函数,是为了注册类A的,而类A中为了使用类B的方法,A类先把类B注册到自己内部,然后再把A类this指针注册到B类中。这样就会存在互相注册的情况:
class A
{
void register(class B* b)
{
m_b = b;
m_b->register(this);
}
void run()
{
cout<<"run A action"<<endl;
}
pravite:
B * m_b;
}
class B
{
void register(class A* a)
{
m_a = a;
}
void run()
{
m_a->run();
}
pravite:
A* m_a;
}
void main()
{
A *a = new A;
B *b = new B;
a->register(b)
b->run();//b拥有了a的方法,相当于a给b开了后门,b作为正式员工使用了a公司中的设备,资料。
}
上述这种方式明显。。。。
2. 对比装饰模式
那读者会问了,装饰模式不也一样嘛?
其实不一样,装饰模式装饰类和公司类仍旧继承于同一个基类,装饰类仍旧属于公司,且与公司类一样的接口,只是会多了一些功能,那下一节就讨论下装饰模式。
装饰模式 | 访问者模式 |
---|---|
两个类不想管互相注册 | 继承自被装饰类 |