访问者模式简单实现

设计模式目录
访问者模式几种模式的对比分析
这个是一个复杂的模式,个人认为是设计中最复杂的模式。
关于该模式我还会做如下
1.其他模式做很多的对比分析(和观察者,和桥接)。
2.从面相对象角度分析这个模式(这是一个把多态的特性用到极至的模式)

不多说了:
访问者模式:1.定义一个访问者(Visitor),在访问者内定义如下函数(VisitorConcreteElement(X)),该函数有一个输入参数(被访问者)该函数会根据访问者不同,执行不同的机能。
2.定义接受访问原件(Element),定义一个接受访问函数(Accept),该函数会调用与版本的应用的机能函数(Operation(X)).
总结:一个函数(Accept),因接受不同的访问者,而变更不同的机能。

如下的说明并不是该模式的必要要求,只是目的的方向之一
补充:上面好像对Operation函数的机能没做说明,这里我做一个简单的情景说明:
意图想丰富Accept的机能,让他有两个维度的变化,两个维度分别如下:
1.自己所在的类被继承发生的多态
2.引入参数(Visitor),并调用(VisitorConcreteElement)。

下面上代码(c++)
需求:(如下需求如果看到过前面的桥接模式装饰模式看下面的需求会很容易)
坦克大战访问者模式实现

#include <iostream>

using namespace std;

//
// ---------------------------------抽象层------------------------------
//
class Visitor;
class Tank
{
public:
	virtual void Shot(){}
	virtual void Accept(Visitor& visitor){}
};
class TankB70;
class TankB90;
class Visitor
{
public:
	virtual void VisitB70(TankB70& tank){}
	virtual void VisitB90(TankB90& tank){}
};

//
// ------------------------------实施层----------------------------------
//

//Tank---------------------------------------------------------------
class TankB70: public Tank
{
public:
	virtual void Shot()
	{
		cout<<"70 gong li she cheng"<<"\n";	
	}
	virtual void Accept(Visitor& visitor)
	{
		visitor.VisitB70(*this);
	}
};
class TankB90: public Tank
{
public:
	virtual void Shot()
	{
		cout<<"90 gong li she cheng"<<"\n";	
	}
	virtual void Accept(Visitor& visitor)
	{
		visitor.VisitB90(*this);
	}
};

//Decorator---------------------------------------------------------------
class VisitorA: public Visitor
{
public:
	void VisitB70(TankB70& tank)
	{
		cout<<"hong wai xian 70"<<"\n";
		tank.Shot();
	}
	void VisitB90(TankB90& tank)
	{
		cout<<"hong wai xian 90"<<"\n";
		tank.Shot();	
	}
};
class VisitorB: public Visitor
{
public:
	void VisitB70(TankB70& tank)
	{
		cout<<"shui lu liang xi 70 fenzhong"<<"\n";
		tank.Shot();
	}
	void VisitB90(TankB90& tank)
	{
		cout<<"hong wai xian 90 fenzheng"<<"\n";
		tank.Shot();	
	}
};

//
// 客户端(调用层)
//
int main()
{
	TankB90 tank_90;
	TankB70 tank_70;

	tank_90.Shot();
	VisitorA visiter_a;

	tank_90.Accept(visiter_a);
	tank_70.Accept(visiter_a);

	int a;
	cin>>a;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值