考虑一下设计一个可以包含长方形、正方形、圆形以及文字的视图类。因为视图中每种元素的显示方式都不一样,所以我们很容易做出如下的设计:

CVisitor
{
public
:
virtual
~
CVisitor();
virtual
void
VisitRectangle(CTRectangle
*
pRectangle)
=
0
;
virtual
void
VisitSquare(CTSquare
*
pSquare)
=
0
;
virtual
void
VisitCircle(CTCircle
*
pCircle)
=
0
;
virtual
void
VisitText(CTText
*
pText)
=
0
;
virtual
void
VisitView(CTView
*
pView)
=
0
;
};
CContext
{
public
:
virtual
~
CContext();
virtual
void
Accept(CVisitor
&
v)
=
0
;
};
class
CTRectangle :
public
CContext
{
public
:
void
Accept(CVisitor
&
v) { v.VisitRectangle(
this
); };
};
class
CTSquare :
public
CContext
{
public
:
void
Accept(CVisitor
&
v) { v.VisitSquare(
this
); };
};
class
CTCircle :
public
CContext
{
public
:
void
Accept(CVisitor
&
v) { v.VisitCircle(
this
); };
};
class
CTText :
public
CContext
{
public
:
void
Accept(CVisitor
&
v) { v.VisitText(
this
); };
};
class
CTView :
public
CContext
{
public
:
~
CTView();
void
Accept(CVisitor
&
v);
void
Add(CContext
*
pContext);
private
:
vector
<
CContext
*>
m_vContext;
};
CTView::
~
CTView()
{
while
(
!
m_vContext.empty())
{
CContext
*
pContext
=
(CContext
*
)m_vContext.back();
m_vContext.pop_back();
delete pContext;
}
}
void
CTView::Accept(CVisitor
&
v)
{
for
(vector
<
CContext
*>
::iterator i
=
m_vContext.begin(); i
!=
m_vContext.end();
++
i)
{
(
*
i)
->
Accept(v);
}
v.VisitView(
this
);
}
void
CTView::Add(CContext
*
pContext)
{
m_vContext.push_back(pContext);
}
下面,我们为上面的类添加一个显示视图中各个元素并且计算各个元素个数的visitor:
CShowContextVisitor :
public
CVisitor
{
public
:
CShowContextVisitor();
void
VisitRectangle(CTRectangle
*
pRectangle);
void
VisitSquare(CTSquare
*
pSquare);
void
VisitCircle(CTCircle
*
pCircle);
void
VisitText(CTText
*
pText);
void
VisitView(CTView
*
pView);
private
:
int
m_iRectangleCount;
int
m_iSquareCount;
int
m_iCircleCount;
int
m_iTextCount;
};
CShowContextVisitor::CShowContextVisitor()
: m_iRectangleCount(
0
)
, m_iSquareCount(
0
)
, m_iCircleCount(
0
)
, m_iTextCount(
0
)
{}
//
下面以输出一句话来代替具体的显示
void
CShowContextVisitor::VisitRectangle(CTRectangle
*
pRectangle)
{
cout
<<
“
A Rectangle is Showed!
“
<<
endl;
m_iRectangleCount
++
;
}
void
CShowContextVisitor::VisitSquare(CTSquare
*
pSquare)
{
cout
<<
“
A Square is Showed!
“
<<
endl;
m_iSquareCount
++
;
}
void
CShowContextVisitor::VisitCircle(CTCircle
*
pCircle)
{
cout
<<
“
A Circle is Showed!
“
<<
endl;
m_iCircleCount
++
;
}
void
CShowContextVisitor::VisitText(CTText
*
pText)
{
cout
<<
“
A Text is Showed!
“
<<
endl;
m_iTextCount
++
;
}
void
CShowContextVisitor::VisitView(CTView
*
pView)
{
cout
<<
“
A View is Showed!
“
<<
endl;
cout
<<
“
Rectangle count:
“
<<
m_iRectangleCount
<<
endl;
cout
<<
“
Square count:
“
<<
m_iSquareCount
<<
endl;
cout
<<
“
Circle count:
“
<<
m_iCircleCount
<<
endl;
cout
<<
“
Text count:
“
<<
m_iTextCount
<<
endl;
}
我们可以用下面的测试函数来验证我们的设计是否正确:
Test()
{
CTView TestView;
CTRectangle
*
pRectangle
=
new
CTRectangle;
TestView.Add(pRectangle);
CTSquare
*
pSquare
=
new
CTSquare;
TestView.Add(pSquare);
CTCircle
*
pCircle
=
new
CTCircle;
TestView.Add(pCircle);
CTText
*
pText
=
new
CTText;
TestView.Add(pText);
CShowContextVisitor TestVisitor;
TestView.Accept(TestVisitor);
}
当然,输出跟我们期望的一样:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227768.html原文链接:https://javaforall.net
