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();//调用公司类内部的功能
	}
}

应用场景

  1. 工程上会用到吗?

    我能想到的就是,你想临时给公司类加一个功能,这个功能主要是由访问者带来的,同时也会使用到公司类自有的功能,就用这个模式;
    此外,类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. 对比装饰模式

那读者会问了,装饰模式不也一样嘛?
其实不一样,装饰模式装饰类和公司类仍旧继承于同一个基类,装饰类仍旧属于公司,且与公司类一样的接口,只是会多了一些功能,那下一节就讨论下装饰模式。

装饰模式访问者模式
两个类不想管互相注册继承自被装饰类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值