首页 > 代码库 > loki有感: 访问者模式
loki有感: 访问者模式
一,请输出类名和m_x值。不需要处理CRoot类,只需处理A,B类。CRoot还有一些派送类,也不考虑。
class CRoot
{
public:
int m_x;
};
class A : public CRoot
{
public:
A()
{
m_x = 1;
}
};
class B : public CRoot
{
public:
B()
{
m_x = 2;
}
};
参考答案:
#include <iostream>
using namespace std ;
class CRoot
{
public:
virtual void Show()=0;
int m_x;
};
class A : public CRoot
{
public:
A()
{
m_x = 1;
}
virtual void Show()
{
cout << "类A:" << m_x << endl;
}
};
class B : public CRoot
{
public:
B()
{
m_x = 2;
}
virtual void Show()
{
cout << "类B:" << m_x << endl;
}
};
void main()
{
CRoot* p1 = new A;
CRoot* p2 = new B;
p1->Show();
p2->Show();
}
二,假定:一,CRoot的派送类不会增加。二,CRoot、A、B属于某公司,另外一个公司在他的基础上进行二次开发。二次开发的公司无法修改
这些类,而他们需要经常增加功能,所以希望有一个通用接口。
此情况下:可以使用访问者模式。
#include <iostream>
using namespace std ;
class A;
class B;
class IVistor
{
public:
virtual void VistorA(A& a)=0;
virtual void VistorB(B& a)=0;
};
class CRoot
{
public:
virtual void Accept(IVistor& v)=0;
int m_x;
};
class A : public CRoot
{
public:
A()
{
m_x = 1;
}
virtual void Accept(IVistor& v)
{
v.VistorA(*this);
}
};
class B : public CRoot
{
public:
B()
{
m_x = 2;
}
virtual void Accept(IVistor& v)
{
v.VistorB(*this);
}
};
class CNewVistor : public IVistor
{
public:
void VistorA(A& a)
{
cout << "类A:" << a.m_x << endl;
}
void VistorB(B& b)
{
cout << "类B:" << b.m_x << endl;
}
};
void main()
{
CNewVistor v;
CRoot* p1 = new A();
CRoot* p2 = new B();
p1->Accept(v);
p2->Accept(v);
}
三,不修改CRoot、A、B(现实中很可能没权限修改)。增加新功能:输出A,B等类的类名和m_x的平方。
增加新类
class CNewVistor2 : public IVistor
{
public:
void VistorA(A& a)
{
cout << "类A:" << a.m_x*a.m_x << endl;
}
void VistorB(B& b)
{
cout << "类B:" << b.m_x*b.m_x << endl;
}
};
v的类型改变。
CNewVistor2 v;
loki有感: 访问者模式