访问者模式简单实现
几种模式的对比分析
这个是一个复杂的模式,个人认为是设计中最复杂的模式。
关于该模式我还会做如下
1.其他模式做很多的对比分析(和观察者,和桥接)。
2.从面相对象角度分析这个模式(这是一个把多态的特性用到极至的模式)
不多说了:
访问者模式:1.定义一个访问者(Visitor),在访问者内定义如下函数(VisitorConcreteElement(X)),该函数有一个输入参数(被访问者)该函数会根据访问者不同,执行不同的机能。
2.定义接受访问原件(Element),定义一个接受访问函数(Accept),该函数会调用与版本的应用的机能函数(Operation(X)).
总结:一个函数(Accept),因接受不同的访问者,而变更不同的机能。
如下的说明并不是该模式的必要要求,只是目的的方向之一
补充:上面好像对Operation函数的机能没做说明,这里我做一个简单的情景说明:
意图想丰富Accept的机能,让他有两个维度的变化,两个维度分别如下:
1.自己所在的类被继承发生的多态
2.引入参数(Visitor),并调用(VisitorConcreteElement)。
下面上代码(c++)
需求:(如下需求如果看到过前面的桥接模式和装饰模式看下面的需求会很容易)
#include
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;
}