天天看點

C++通路者模式

Visitor.h檔案内容如下:

通路者和元素之間互以對方為參數

<code>#ifndef __VISITOR__  </code>

<code>#define __VISITOR__  </code>

<code>  </code> 

<code>#include &lt;iostream&gt;  </code>

<code>#include &lt;string&gt;  </code>

<code>#include &lt;vcl.h&gt;  </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-&gt;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-&gt;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(&amp;va);  </code>

<code>ea.Accept(&amp;vb);  </code>

<code>eb.Accept(&amp;va);  </code>

<code>eb.Accept(&amp;vb);</code>

本文轉自Chinayu201451CTO部落格,原文連結:http://blog.51cto.com/9233403/1970606 ,如需轉載請自行聯系原作者

繼續閱讀