Visitor.h檔案内容如下:
通路者和元素之間互以對方為參數
<code>#ifndef __VISITOR__ </code>
<code>#define __VISITOR__ </code>
<code> </code>
<code>#include <iostream> </code>
<code>#include <string> </code>
<code>#include <vcl.h> </code>
<code>using</code> <code>namespace</code> <code>std; </code>
<code>class</code> <code>Element; </code>
<code>///通路者接口類 </code>
<code>class</code> <code>Visitor </code>
<code>{ </code>
<code> </code><code>public</code><code>: </code>
<code> </code><code>virtual</code> <code>void</code> <code>Visit(Element *e) = 0; </code>
<code>}; </code>
<code>//具體通路者A </code>
<code>class</code> <code>VisitorOne : </code><code>public</code> <code>Visitor </code>
<code> </code><code>//實作通路接口,參數為元素,在類外面實作函數體 </code>
<code> </code><code>virtual</code> <code>void</code> <code>Visit(Element *e); </code>
<code>//具體通路者B </code>
<code>class</code> <code>VisitorTwo : </code><code>public</code> <code>Visitor </code>
<code>//========================================================= </code>
<code>//Element類 </code>
<code>class</code> <code>Element </code>
<code> </code><code>virtual</code> <code>void</code> <code>Accept(Visitor *v) </code>
<code> </code><code>{ </code>
<code> </code><code>v->Visit(</code><code>this</code><code>);</code><code>//調用通路者接口 </code>
<code> </code><code>} </code>
<code> </code><code>char</code><code>* GetName() </code>
<code> </code><code>return</code> <code>(</code><code>char</code><code>*)m_name.c_str(); </code>
<code> </code><code>//類中待通路的元素 </code>
<code> </code><code>string m_name; </code>
<code>//具有個性資料的元素 </code>
<code>class</code> <code>ElementA: </code><code>public</code> <code>Element </code>
<code> </code><code>ElementA(string s) </code>
<code> </code><code>m_name = s;</code><code>//傳入父類成員m_name中 </code>
<code>class</code> <code>ElementB : </code><code>public</code> <code>Element </code>
<code> </code><code>ElementB(string s) </code>
<code> </code><code>m_name = s; </code>
<code>//通路者類one對元素處理方法(須聲明到Element類的後面否則編譯不能通過) </code>
<code>void</code> <code>VisitorOne::Visit(Element *e) </code>
<code> </code><code>//擷取元素中的資料 </code>
<code> </code><code>char</code> <code>* data = e->GetName(); </code>
<code> </code><code>char</code> <code>szTemp[] = </code><code>"正在處理資料:"</code><code>; </code>
<code> </code><code>strcat</code><code>(szTemp,data); </code>
<code> </code><code>char</code> <code>szTip[] = </code><code>"第一個通路者"</code><code>; </code>
<code> </code><code>MessageBox(0,+szTemp,szTip,0); </code>
<code>} </code>
<code>//通路者類two對元素的處理方法 </code>
<code>void</code> <code>VisitorTwo::Visit(Element *e) </code>
<code> </code><code>char</code> <code>szTemp[] = </code><code>"正在處理資料:"</code><code>; </code>
<code> </code><code>char</code> <code>szTip[] = </code><code>"第二個通路者"</code><code>; </code>
<code>#endif</code>
調用方法如下:
<code>ElementA ea(</code><code>"元素A"</code><code>); </code>
<code>ElementB eb(</code><code>"元素B"</code><code>); </code>
<code>VisitorOne va; </code>
<code>VisitorTwo vb; </code>
<code>// 雙分派,“接受者”和“通路者”決定了一個操作 </code>
<code>ea.Accept(&va); </code>
<code>ea.Accept(&vb); </code>
<code>eb.Accept(&va); </code>
<code>eb.Accept(&vb);</code>
本文轉自Chinayu201451CTO部落格,原文連結:http://blog.51cto.com/9233403/1970606 ,如需轉載請自行聯系原作者