﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-积木-随笔分类-设计模式</title><link>http://www.cppblog.com/Tongy0/category/16886.html</link><description>No sub title</description><language>zh-cn</language><lastBuildDate>Tue, 28 Jun 2011 17:38:45 GMT</lastBuildDate><pubDate>Tue, 28 Jun 2011 17:38:45 GMT</pubDate><ttl>60</ttl><item><title>Mediator模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/06/28/149639.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Tue, 28 Jun 2011 02:26:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/06/28/149639.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/149639.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/06/28/149639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/149639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/149639.html</trackback:ping><description><![CDATA[<div>Mediator模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该模型主要解决两个或多个对象间的相互通信的问题。（个人认为该模式的思想同Observer模式的思想还是有点类似的。表面上看，他们所解决的问题类型根本不同，那为什么我会这么认为了？后面再说明）。按理说，各对象间的通信假如：ObjA与ObjB要进行通信。方法有好多种。比如：可以在它们内部各存一份对方的引用。在一方变动时，调用另一方进行同步即可。但确实如果系统大而复杂时，这将显示的不那么清晰。因此，就希望中间会有个调停者。Mediator模式就因此而生。此时，ObjA与ObjB内部只存为一份Mediator(MediatorObj)对象的引用。在对象变动时，只需调用MediatorObj的相关接口，通知其他对象需要同步更新即可。因此，对ObjA或ObjB或其他的任何对象来说，它们有可能根本不知道还有其他的对象存在。（如：ObjA可能不知道ObjB的存在。）但通过MediatorObj对象，却达到了ObjA与ObjB的同步作用。（现在想下，是不是与Observer模式有点类似？因为，如果在Observer模式的实现上，抽象出一个IObserverable来。那通过IObserverable对象，可以通知所有View的更新）。<br />&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CClassA;<br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CClassB;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CMediator<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CMediator(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;CMediator(CClassA</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pObjA,&nbsp;CClassB</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pObjB)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pObjA&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pObjA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pObjB&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pObjB;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoSyncFromAToB(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pObjB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">xxx<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoSyncFromBToA(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pObjA</span><span style="color: #000000">-&gt;</span><span style="color: #000000">xxx<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CClassA</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pObjA;<br />&nbsp;&nbsp;&nbsp;&nbsp;CClassB</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pObjB;<br />};<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CClassA<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CClassA(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;CClassA(CMediator</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pMediator)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pMediator&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMediator;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoAction(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;some&nbsp;work&nbsp;here<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;通知其他对象，需要同步</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pMediator</span><span style="color: #000000">-&gt;</span><span style="color: #000000">DoSyncFromAToB();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CMediator</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pMediator;<br />};<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CClassB<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CClassB(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;CClassB(CMediator</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pMediator)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pMediator&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMediator;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoAction(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;some&nbsp;work&nbsp;here<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;通知其他对象，需要同步</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pMediator</span><span style="color: #000000">-&gt;</span><span style="color: #000000">DoSyncFromBToA();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CMediator</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pMediator;<br />};</span></div></div><img src ="http://www.cppblog.com/Tongy0/aggbug/149639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-06-28 10:26 <a href="http://www.cppblog.com/Tongy0/archive/2011/06/28/149639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memento模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/06/28/149635.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Tue, 28 Jun 2011 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/06/28/149635.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/149635.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/06/28/149635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/149635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/149635.html</trackback:ping><description><![CDATA[<div>Memento模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该模式的出现，主要是为了让用户拥有&#8220;撤销&#8221;的操作。好给用户有个恢复先前状态的权力。其主要思想就是将对象（假设其类型为：ClassA）的先前状态记录起来（当然自己得管理好）。在需要时，用此恢复。根据此思路，当然实现方法就多种多样。下面参考设计模式资料中的c++代码。（觉得此代码设计还是挺有道理的。因为对Memento类来说，除了ClassA的对象外，其他类型的对象都不需要，且也不应该能访问到。因此，在具体实现上，它用了友元的技术）。
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">typedef&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;State;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;COperationsMemento<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">其实更强的，可以将该类设计成。可以维护一组状态的。这样，就可以支持<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">任意恢复到先前的第N种状态。就好似photoshop的层的那样的撤销。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">为说明思想，此暂时只维护一个状态。</span><span style="color: #008000"><br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;State&nbsp;GetState(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetState(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;State</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;state)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;some&nbsp;code&nbsp;here<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;State&nbsp;_sta;<br />};<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;COperationSteps<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;COperationsMemento;<br />&nbsp;&nbsp;&nbsp;&nbsp;COperationSteps()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pMemento&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">normal</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;COperationSteps(COperationsMemento</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pMemento)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">m_pMemento&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMemento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">normal</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">COperationSteps()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_pMemento&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pMemento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMemento&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">存储状态(即：保存状态)</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SaveState(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_pMemento&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMemento&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;COperationsMemento();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMemento</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetState(</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">恢复状态</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RestoreState(COperationsMemento</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pMemento&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pMemento&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pMemento</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetState();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">_sta&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_pMemento</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetState();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;COperationsMemento</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pMemento;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">需要维护，因为该状态，是自己私有的</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;State&nbsp;_sta;<br />};</span></div><br /></div><img src ="http://www.cppblog.com/Tongy0/aggbug/149635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-06-28 10:02 <a href="http://www.cppblog.com/Tongy0/archive/2011/06/28/149635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strategy模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/06/12/148525.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 12 Jun 2011 04:13:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/06/12/148525.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/148525.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/06/12/148525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/148525.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/148525.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Strategy模式（即：策略模式）。其所要所要解决的问题，同Template模式是同一类问题。但具体的处理方式有所不同。Template则是使用：封装继承与多态的方式实现（主要是：继承与多态）。而策略模式，则主要使用继承连同&#8220;组合&#8221;的方式来实现逻辑接口的提供。因此，如果Template模式中的逻辑接口要是有许多的话，则逻辑抽象基类，将变得十分庞大而复杂。同时，不同实现类的接口将全部暴露无疑。而组合则重在将某一逻辑接口的实现通过多个对象的组合方式实现之。下面看下策略模式的结构：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Strategy<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_15_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_140_Open_Text.style.display='none'; Codehighlighter1_15_140_Closed_Image.style.display='inline'; Codehighlighter1_15_140_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_15_140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_15_140_Closed_Text.style.display='none'; Codehighlighter1_15_140_Open_Image.style.display='inline'; Codehighlighter1_15_140_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_15_140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_15_140_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func1(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func2(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">这两个接口只是示例<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;some&nbsp;other&nbsp;interfaces&nbsp;here</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Sub1&nbsp;:&nbsp;Strategy<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_166_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_276_Open_Text.style.display='none'; Codehighlighter1_166_276_Closed_Image.style.display='inline'; Codehighlighter1_166_276_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_166_276_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_166_276_Closed_Text.style.display='none'; Codehighlighter1_166_276_Open_Image.style.display='inline'; Codehighlighter1_166_276_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_166_276_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_166_276_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func1(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img id="Codehighlighter1_197_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_224_Open_Text.style.display='none'; Codehighlighter1_197_224_Closed_Image.style.display='inline'; Codehighlighter1_197_224_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_197_224_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_224_Closed_Text.style.display='none'; Codehighlighter1_197_224_Open_Image.style.display='inline'; Codehighlighter1_197_224_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_197_224_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_197_224_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;something<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #008080">16</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func2(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_247_274_Open_Image" onclick="this.style.display='none'; Codehighlighter1_247_274_Open_Text.style.display='none'; Codehighlighter1_247_274_Closed_Image.style.display='inline'; Codehighlighter1_247_274_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_247_274_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_247_274_Closed_Text.style.display='none'; Codehighlighter1_247_274_Open_Image.style.display='inline'; Codehighlighter1_247_274_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_247_274_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_247_274_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;something<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #008080">20</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Sub2&nbsp;:&nbsp;Strategy<br /></span><span style="color: #008080">24</span><span style="color: #000000"><img id="Codehighlighter1_302_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_302_412_Open_Text.style.display='none'; Codehighlighter1_302_412_Closed_Image.style.display='inline'; Codehighlighter1_302_412_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_302_412_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_302_412_Closed_Text.style.display='none'; Codehighlighter1_302_412_Open_Image.style.display='inline'; Codehighlighter1_302_412_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_302_412_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_302_412_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func1(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /></span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_333_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_360_Open_Text.style.display='none'; Codehighlighter1_333_360_Closed_Image.style.display='inline'; Codehighlighter1_333_360_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_333_360_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_333_360_Closed_Text.style.display='none'; Codehighlighter1_333_360_Open_Image.style.display='inline'; Codehighlighter1_333_360_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_333_360_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_333_360_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;something<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #008080">29</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func2(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /></span><span style="color: #008080">31</span><span style="color: #000000"><img id="Codehighlighter1_383_410_Open_Image" onclick="this.style.display='none'; Codehighlighter1_383_410_Open_Text.style.display='none'; Codehighlighter1_383_410_Closed_Image.style.display='inline'; Codehighlighter1_383_410_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_383_410_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_383_410_Closed_Text.style.display='none'; Codehighlighter1_383_410_Open_Image.style.display='inline'; Codehighlighter1_383_410_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_383_410_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_383_410_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;something<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #008080">33</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">35</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Strategy;<br /></span><span style="color: #008080">37</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">策略类结构</span><span style="color: #008000"><br /></span><span style="color: #008080">38</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Context<br /></span><span style="color: #008080">39</span><span style="color: #000000"><img id="Codehighlighter1_454_714_Open_Image" onclick="this.style.display='none'; Codehighlighter1_454_714_Open_Text.style.display='none'; Codehighlighter1_454_714_Closed_Image.style.display='inline'; Codehighlighter1_454_714_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_454_714_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_454_714_Closed_Text.style.display='none'; Codehighlighter1_454_714_Open_Image.style.display='inline'; Codehighlighter1_454_714_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_454_714_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_454_714_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">40</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">41</span><span style="color: #000000"><img id="Codehighlighter1_535_536_Open_Image" onclick="this.style.display='none'; Codehighlighter1_535_536_Open_Text.style.display='none'; Codehighlighter1_535_536_Closed_Image.style.display='inline'; Codehighlighter1_535_536_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_535_536_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_535_536_Closed_Text.style.display='none'; Codehighlighter1_535_536_Open_Image.style.display='inline'; Codehighlighter1_535_536_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;Context(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Strategy</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pStrategyObj)&nbsp;:&nbsp;m_pStrategyObj(pStrategyObj)&nbsp;</span><span id="Codehighlighter1_535_536_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_535_536_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /></span><span style="color: #008080">43</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;逻辑接口DoAction</span><span style="color: #008000"><br /></span><span style="color: #008080">44</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoAction(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /></span><span style="color: #008080">45</span><span style="color: #000000"><img id="Codehighlighter1_589_712_Open_Image" onclick="this.style.display='none'; Codehighlighter1_589_712_Open_Text.style.display='none'; Codehighlighter1_589_712_Closed_Image.style.display='inline'; Codehighlighter1_589_712_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_589_712_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_589_712_Closed_Text.style.display='none'; Codehighlighter1_589_712_Open_Image.style.display='inline'; Codehighlighter1_589_712_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_589_712_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_589_712_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">46</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(NULL&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;m_pStragegyObj)<br /></span><span style="color: #008080">47</span><span style="color: #000000"><img id="Codehighlighter1_627_708_Open_Image" onclick="this.style.display='none'; Codehighlighter1_627_708_Open_Text.style.display='none'; Codehighlighter1_627_708_Closed_Image.style.display='inline'; Codehighlighter1_627_708_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_627_708_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_627_708_Closed_Text.style.display='none'; Codehighlighter1_627_708_Open_Image.style.display='inline'; Codehighlighter1_627_708_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_627_708_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_627_708_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">48</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pStrategyObj</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Func1();<br /></span><span style="color: #008080">49</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pStrategyObj</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Func2();<br /></span><span style="color: #008080">50</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #008080">51</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">52</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">53</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 注意：设计模式中，更提倡优先使用组合，而非继承。详细原因，也可以从以上模式比较得出。<br /></p><img src ="http://www.cppblog.com/Tongy0/aggbug/148525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-06-12 12:13 <a href="http://www.cppblog.com/Tongy0/archive/2011/06/12/148525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Template模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/06/12/148524.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 12 Jun 2011 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/06/12/148524.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/148524.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/06/12/148524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/148524.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/148524.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Template模型，其实很容易理解，相信大家平时也经常在用。其主要思想就同处理这么一类问题：有A对象，与B对象（或更多），它们的处理不同，但他们的逻辑却是相同的。因此，我们在处理这类问题时，很自然的就会想到。给它们的逻辑处理用一抽象类封装起来。用两个具体的（实现）派生类继承之。这就是Template模型的原理。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是程序示例： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LogicalAbstractClass<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_27_202_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_202_Open_Text.style.display='none'; Codehighlighter1_27_202_Closed_Image.style.display='inline'; Codehighlighter1_27_202_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_27_202_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_202_Closed_Text.style.display='none'; Codehighlighter1_27_202_Open_Image.style.display='inline'; Codehighlighter1_27_202_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_27_202_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_27_202_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;some&nbsp;code&nbsp;here<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;逻辑接口1</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Logical1(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;逻辑接口2</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Logical2(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;some&nbsp;other&nbsp;logical&nbsp;interfaces</span><span style="color: #008000"><br /></span><span style="color: #008080">10</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SubClassA&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LogicalAbstractClass<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_252_341_Open_Image" onclick="this.style.display='none'; Codehighlighter1_252_341_Open_Text.style.display='none'; Codehighlighter1_252_341_Closed_Image.style.display='inline'; Codehighlighter1_252_341_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_252_341_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_252_341_Closed_Text.style.display='none'; Codehighlighter1_252_341_Open_Image.style.display='inline'; Codehighlighter1_252_341_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_252_341_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_252_341_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img id="Codehighlighter1_284_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_290_Open_Text.style.display='none'; Codehighlighter1_284_290_Closed_Image.style.display='inline'; Codehighlighter1_284_290_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_284_290_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_290_Closed_Text.style.display='none'; Codehighlighter1_284_290_Open_Image.style.display='inline'; Codehighlighter1_284_290_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Logical1(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)</span><span id="Codehighlighter1_284_290_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_290_Open_Text"><span style="color: #000000">{&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img id="Codehighlighter1_314_339_Open_Image" onclick="this.style.display='none'; Codehighlighter1_314_339_Open_Text.style.display='none'; Codehighlighter1_314_339_Closed_Image.style.display='inline'; Codehighlighter1_314_339_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_314_339_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_314_339_Closed_Text.style.display='none'; Codehighlighter1_314_339_Open_Image.style.display='inline'; Codehighlighter1_314_339_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Logical2(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)</span><span id="Codehighlighter1_314_339_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_314_339_Open_Text"><span style="color: #000000">{&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">/</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SubClassB&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LogicalAbstractClass<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_391_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_391_480_Open_Text.style.display='none'; Codehighlighter1_391_480_Closed_Image.style.display='inline'; Codehighlighter1_391_480_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_391_480_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_391_480_Closed_Text.style.display='none'; Codehighlighter1_391_480_Open_Image.style.display='inline'; Codehighlighter1_391_480_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_391_480_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_391_480_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img id="Codehighlighter1_423_429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_423_429_Open_Text.style.display='none'; Codehighlighter1_423_429_Closed_Image.style.display='inline'; Codehighlighter1_423_429_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_423_429_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_423_429_Closed_Text.style.display='none'; Codehighlighter1_423_429_Open_Image.style.display='inline'; Codehighlighter1_423_429_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Logical1(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)</span><span id="Codehighlighter1_423_429_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_423_429_Open_Text"><span style="color: #000000">{&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_453_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_453_478_Open_Text.style.display='none'; Codehighlighter1_453_478_Closed_Image.style.display='inline'; Codehighlighter1_453_478_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_453_478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_453_478_Closed_Text.style.display='none'; Codehighlighter1_453_478_Open_Image.style.display='inline'; Codehighlighter1_453_478_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Logical2(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)</span><span id="Codehighlighter1_453_478_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_453_478_Open_Text"><span style="color: #000000">{&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">/</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argc[])<br /></span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_517_679_Open_Image" onclick="this.style.display='none'; Codehighlighter1_517_679_Open_Text.style.display='none'; Codehighlighter1_517_679_Closed_Image.style.display='inline'; Codehighlighter1_517_679_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_517_679_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_517_679_Closed_Text.style.display='none'; Codehighlighter1_517_679_Open_Image.style.display='inline'; Codehighlighter1_517_679_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_517_679_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_517_679_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;LogicalAbstractClass</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pA&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;LogicalAbstractClass</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pB&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pA&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SubClassA;<br /></span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pB&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SubClassB;<br /></span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /></span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pB;<br /></span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pA;<br /></span><span style="color: #008080">35</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;补充：Delphi的code示例就不给了。一个道理。懂得思想，所有语言通用。<img src ="http://www.cppblog.com/Tongy0/aggbug/148524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-06-12 11:51 <a href="http://www.cppblog.com/Tongy0/archive/2011/06/12/148524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/21/146892.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sat, 21 May 2011 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/21/146892.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146892.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/21/146892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146892.html</trackback:ping><description><![CDATA[<p>&nbsp;该模式也相对简单。其主要处理的是这类问题：当系统或某些模块已经成形后，突然需要增加某些功能。而这些功能的增加<br />在现有的对象中，暂时没有办法处理。同时，却发现，该功能，其实另一模块的对象却可以处理的了。因此，就希望能够在不修改原<br />有操作及系统结构的情况下，就自然而然地将该功能实现出来。此时，就可以使用Adapter来处理之。（注：在此，我们强调的是不<br />去修改原有系统的结构的情况下）。<br />&nbsp;就上述问题，Adapter模式有两种解决方法。一种是通过对象适配来解决。另一种是通过类适配来解决。所谓的对象适配，指<br />的是，通过引入具有我们需要功能接口的对象（设类为X），在实现处理过程中，我们使用的是X的功能接口，以此来达到我们的需求。<br />而类适配，则指的是，产生一个新类，让该新类，继承自X类，则自然，该新类就会有了X的相关接口。下面看下，这两种适配的代码。</p>
<p>对象适配<br />class X<br />{<br />public:<br />&nbsp;...<br />&nbsp;virtual func(...);<br />};</p>
<p>class ObjAdapterObject : public ...<br />{<br />public:<br />&nbsp;void func(...)<br />&nbsp;{<br />&nbsp;&nbsp;if (m_pXObj != NULL)<br />&nbsp;&nbsp;&nbsp;m_pXObj-&gt;func(...);<br />&nbsp;}<br />private:<br />&nbsp;X* m_pXObj;<br />};</p>
<p>类适配<br />class X的声明及定义同上。</p>
<p>class ClassAdapterObject: public X, public&nbsp; ...<br />{<br />public:<br />&nbsp;...<br />};</p>
<p>以下调用就不写了，你懂得的。</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-21 23:54 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/21/146892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/20/146785.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Thu, 19 May 2011 16:39:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/20/146785.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146785.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/20/146785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146785.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146785.html</trackback:ping><description><![CDATA[<p>Facade模式</p>
<p>&nbsp;（Facade模式）门面模式与Proxy模式其实还是有点相似的。也是主要实现一种功能的封装。Facade模式，主要是将几个有相关性的功能操作，封装到一起，由统一的接口提供。<br />使用时，通过该接口即可完成所有相关的功能。此有个好处，就是提高解耦性与增加高聚性。实现中，查处问题也相对方便。<br />&nbsp;简单，代码不就给了。</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-20 00:39 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/20/146785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之八</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/20/146783.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Thu, 19 May 2011 16:38:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/20/146783.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146783.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/20/146783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146783.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146783.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>十：Flyweight模式（即：享元模式）</p>
<p>&nbsp;说的直观点，Flyweight模式其实就是实现一个对象缓存池。取对象，优先从该池中取出。而它们的区别在于：从前者中取东西时，如果不存在。则可以新产生一个，并返回。<br />而从后者中取时，存在就返回，不存在，就返回为空。<br />&nbsp;由上面的解释，不难想象，该模式的实现：<br />class Flyweight<br />{<br />public:<br />&nbsp;...<br />};</p>
<p>class SubFlyweightObjX : public Flyweight<br />{<br />...<br />};</p>
<p>class SubFlyweightObjY : public Flyweight<br />{<br />...<br />};</p>
<p>//Flyweight类的结构<br />class FlyweightBuffFactory<br />{<br />public:<br />&nbsp;Flyweight* GetFlyweight(...condition...)<br />&nbsp;{<br />&nbsp;&nbsp;for (vector&lt;Flyweight* &gt;::iterator iter = m_vBuffer.begin(); iter != m_vBuffer.end(); iter++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;if (iter.xxx = condition)<br />&nbsp;&nbsp;&nbsp;&nbsp;return (Flyweight*)iter;//注：如果此句不行用这句：return (Flyweight*)(&amp;(*iter));<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;Flyweight* pReturn = new xxx;<br />&nbsp;&nbsp;m_vBuffer.push_back(pReturn);<br />&nbsp;&nbsp;return pReturn;<br />&nbsp;}</p>
<p>private:<br />&nbsp;vector&lt;Flyweight* &gt; m_vBuffer;<br />};</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-20 00:38 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/20/146783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Proxy模式</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/20/146784.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Thu, 19 May 2011 16:38:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/20/146784.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146784.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/20/146784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146784.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146784.html</trackback:ping><description><![CDATA[<p>Proxy模式</p>
<p>&nbsp;代理模式其，思想倒类似于封装的概念。主要是将某功能操作通过另一对象，来全权处理。对<br />被代理的对象，它不管你是如何处理。它只要结果。比如：对数据的提取。原本可能要经过N个对象共<br />同配合，最终取得数据。此时，可以用一个代理对象，来全权处理之。又比如说：我们上网，打开网页，<br />可以通过windows的网络功能模块，去解析，并最终打开网页。同时也可以通过代理，解析并最终打开网<br />页。</p>
<p>&nbsp;下面是参考代码<br />class Subject<br />{<br />public:<br />&nbsp;virtual void Request() = 0;<br />protected:<br />&nbsp;Subject(){}<br />};</p>
<p>class ImplSubject<br />{<br />public:<br />&nbsp;virtual void Request(){ //....}<br />};</p>
<p>class Proxy<br />{<br />public:<br />&nbsp;Proxy(){}<br />&nbsp;Proxy(Subject* sub){m_pSub = sub;}<br />private:<br />&nbsp;Subject* m_pSub;<br />&nbsp;void Request(){ m_pSub-&gt;Request();}<br />};</p>
<p>int main(int argc, char* argv[])<br />{<br />&nbsp;Subject* sub = new ImplSubject();<br />&nbsp;Proxy* p = new Proxy(sub);<br />&nbsp;p-&gt;Request();<br />&nbsp;return 0;<br />}</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-20 00:38 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/20/146784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之七</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/20/146782.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Thu, 19 May 2011 16:35:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/20/146782.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146782.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/20/146782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146782.html</trackback:ping><description><![CDATA[<p>九：Decorator模式（即：装饰模式）</p>
<p>&nbsp;(注2)假设有这样的一个问题存在（其实现实开发中，非常经常遇到）：基类BasicClassX有N个的派生类。因为它们没有功能接口void UnknowFunction(void);<br />按正常的。我们的处理方法，（1） 可以通过直接修改BasicClassX基类，在此添加virtual void UnknowFunction(void);虚接口并实现，然后所有derived <br />class中均可见。（2） 又或是在BasicClassX基类，添加了纯虚接口，然后在具体某派生类中进行了实现。在实现使用中，用该derived class来处理。<br />&nbsp;(注3)但这样做会有这样的问题存在：a) 会有可能让继承的深度，变的很深。系统的类将变的很多，很复杂。b) 类的结构也将变的复杂化。（因为现<br />在是增加个接口，以后要是又有其他的接口功能需要添加了？？？） c) 无形中，会加重基类的负担。因为必须得保证扩展该接口，否则基类看不到该接<br />口。<br />&nbsp;(注1)为了解决上面的问题。Decorator模式就可以帮助我们很轻松地解决。我们实现一个Decorator类。该类，只要引用一个BasicClassX指针对象即可。<br />然后在Decorator类中，扩展功能接口，这样，新扩展的功能就与BasicClassX的相关类，无任何关系。只是在BasicClassX相关类需要该扩展接口的地方，<br />使用Decorator类来处理即可。就相当于BasicClassX的对象（或是它的derived class object）委托Decorator来实现处理一样。但又同时像是将BasicClassX<br />对象与Decorator对象进行组合在一起使用。从而达到新接口的扩展作用。Decorator模式就是这么回事。<br />&nbsp;下面简要提炼下Decorator类的设计<br />&nbsp;SubClassA : BasicClassX;<br />&nbsp;SubClassB : BasicClassX;<br />&nbsp;SubClassC : SubClassA;<br />&nbsp;...<br />&nbsp;SubClassN : ... : BasicClassX;</p>
<p>&nbsp;class Decorator : BasicClassX<br />&nbsp;{<br />&nbsp;public:<br />&nbsp;&nbsp;Decorator(BasicClassX* pBObj){m_pBOjb = pBObj;}<br />&nbsp;&nbsp;void DoOperate(void)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;m_pBObj-&gt;DoOperator();<br />&nbsp;&nbsp;&nbsp;// do new interface<br />&nbsp;&nbsp;&nbsp;this-&gt;DoNewInterfaceFunction();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;//new extened interface function<br />&nbsp;&nbsp;void DoNewInterfaceFunction(void){//do something...}<br />&nbsp;&nbsp;// new extened other interface function <br />&nbsp;&nbsp;...<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//write down other code in here you knowned.<br />&nbsp;&nbsp;...<br />&nbsp;private:<br />&nbsp;&nbsp;BasicClassX* m_pBObj;<br />&nbsp;}<br />&nbsp;个人认为，Decorator模式，你说它有用。它确实有用。说它没用。其实它也没用。为啥这样说了？因为它完全可以通过，继承，或者直接修改原有的类体系来<br />实现。但它的存在，也确实会让系统的思路清晰些。至少代码相对不会那么乱。</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-20 00:35 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/20/146782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之六</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/18/146609.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Tue, 17 May 2011 16:46:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/18/146609.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146609.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/18/146609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146609.html</trackback:ping><description><![CDATA[<p>设计模式学习总结之六</p>
<p>八：Composite模式（即：复合模式）</p>
<p>&nbsp;复合模式旨在将递归处理，转化为一种顺序处理。明显地，递归处理，相对较耗资源。也相对较为抽象些。而用一个Composite类对象来转化处理<br />递归处理。将显得直观些。它与Decorator模式的区别是：Composite模式，旨在构造一个类。这个类，将原本是递归组织的树状结构，转换为直观地转化为<br />顺序结构。即：它重要于转化表现。而Decorator模式（即：修饰模式），其重要简化管理原本系统类体系结构。不至于将类继承体系越来越深。同时，不<br />至于让原本设计好的类，越来越复杂化。同时又可以为原本类体系添加新的功能（即：书上所述的新的职责）。</p>
<p>&nbsp;下面简要看下该模式的代码结构：</p>
<p>class ClassNode<br />{<br />public:<br />&nbsp;//写下构造函数等<br />&nbsp;...<br />public:<br />&nbsp;virtual void Operation(void);<br />&nbsp;virtual void Add(ClassNode* pNode);<br />&nbsp;virtual void Remove(ClassNode* pNode);<br />&nbsp;virtual ClassNode* GetNode(int iIndex);<br />}</p>
<p>//Composite类<br />class Composite : public ClassNode<br />{<br />public:<br />&nbsp;typedef vector&lt;ClassNode* &gt; NODELISTVEC;<br />public:<br />&nbsp;void Operation(void)<br />&nbsp;{<br />&nbsp;&nbsp;for (NODELISTVEC::iterator iter = m_vNodeList.begin(); iter != m_vNodeList.end(); iter++)<br />&nbsp;&nbsp;&nbsp;iter-&gt;Operation();<br />&nbsp;}<br />&nbsp;void Add(ClassNode* pNode){//do something...}<br />&nbsp;void Remove(ClassNode* pNode){//do something...}<br />&nbsp;ClassNode* GetNode(int iIndex){//do something...}<br />private:<br />&nbsp;NODELISTVEC m_vNodeList;<br />}</p>
<p>//调用<br />int main(int argc, char* argv[])<br />{<br />&nbsp;Composite* MyCompositeForNodes = new ...;<br />&nbsp;ClassNode* xxx = new ...;//创建节点。当然这里只是为了演示，所以只创建一个节点。一棵树有可能有N个节点。<br />&nbsp;MyCom,positeForNodes.Add(xxx );<br />&nbsp;...<br />&nbsp;MyCompositeForNodes.Operation();<br />}</p>
<p>//个人认为，该模式，很怪啊。。因为通过这样转换后，原本的父子关系就被破坏掉了。<br />//如果有大侠理解的深的话，，还请不吝补充下。。不盛感激。</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-18 00:46 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/18/146609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之五</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/17/146532.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Mon, 16 May 2011 17:16:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/17/146532.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146532.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/17/146532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146532.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146532.html</trackback:ping><description><![CDATA[<p>设计模式学习总结之五</p>
<p>七：Decorator模式（即：装饰模式）</p>
<p>&nbsp;(注2)假设有这样的一个问题存在（其实现实开发中，非常经常遇到）：基类BasicClassX有N个的派生类。因为它们没有功能接口void UnknowFunction(void);<br />按正常的。我们的处理方法，（1） 可以通过直接修改BasicClassX基类，在此添加virtual void UnknowFunction(void);虚接口并实现，然后所有derived <br />class中均可见。（2） 又或是在BasicClassX基类，添加了纯虚接口，然后在具体某派生类中进行了实现。在实现使用中，用该derived class来处理。<br />&nbsp;(注3)但这样做会有这样的问题存在：a) 会有可能让继承的深度，变的很深。系统的类将变的很多，很复杂。b) 类的结构也将变的复杂化。（因为现<br />在是增加个接口，以后要是又有其他的接口功能需要添加了？？？） c) 无形中，会加重基类的负担。因为必须得保证扩展该接口，否则基类看不到该接<br />口。<br />&nbsp;(注1)为了解决上面的问题。Decorator模式就可以帮助我们很轻松地解决。我们实现一个Decorator类。该类，只要引用一个BasicClassX指针对象即可。<br />然后在Decorator类中，扩展功能接口，这样，新扩展的功能就与BasicClassX的相关类，无任何关系。只是在BasicClassX相关类需要该扩展接口的地方，<br />使用Decorator类来处理即可。就相当于BasicClassX的对象（或是它的derived class object）委托Decorator来实现处理一样。但又同时像是将BasicClassX<br />对象与Decorator对象进行组合在一起使用。从而达到新接口的扩展作用。Decorator模式就是这么回事。<br />&nbsp;下面简要提炼下Decorator类的设计<br />&nbsp;SubClassA : BasicClassX;<br />&nbsp;SubClassB : BasicClassX;<br />&nbsp;SubClassC : SubClassA;<br />&nbsp;...<br />&nbsp;SubClassN : ... : BasicClassX;</p>
<p>&nbsp;class Decorator : BasicClassX<br />&nbsp;{<br />&nbsp;public:<br />&nbsp;&nbsp;Decorator(BasicClassX* pBObj){m_pBOjb = pBObj;}<br />&nbsp;&nbsp;void DoOperate(void)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;m_pBObj-&gt;DoOperator();<br />&nbsp;&nbsp;&nbsp;// do new interface<br />&nbsp;&nbsp;&nbsp;this-&gt;DoNewInterfaceFunction();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;//new extened interface function<br />&nbsp;&nbsp;void DoNewInterfaceFunction(void){//do something...}<br />&nbsp;&nbsp;// new extened other interface function <br />&nbsp;&nbsp;...<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//write down other code in here you knowned.<br />&nbsp;&nbsp;...<br />&nbsp;private:<br />&nbsp;&nbsp;BasicClassX* m_pBObj;<br />&nbsp;}<br />&nbsp;个人认为，Decorator模式，你说它有用。它确实有用。说它没用。其实它也没用。为啥这样说了？因为它完全可以通过，继承，或者直接修改原有的类体系来<br />实现。但它的存在，也确实会让系统的思路清晰些。至少代码相对不会那么乱。</p><img src ="http://www.cppblog.com/Tongy0/aggbug/146532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-17 01:16 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/17/146532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之四</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/16/146440.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 15 May 2011 16:42:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/16/146440.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146440.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/16/146440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146440.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146440.html</trackback:ping><description><![CDATA[<p>设计模式学习总结之四</p>
<p>六：Bridge模式（即：桥接模式）</p>
<p>&nbsp;讲之前，先声明：由于本人电脑不是很好，没法装上vc环境运行。因此以下代码，仅是手工输入，在环境中未必能编译通过。<br>但以下，仅仅只是介绍一种思想。仅供参考。同时，如果说明有误之处，欢迎指正。另外，则于一次性手工输入下面那么多东东，确实<br>不容易，所以Delphi的具体实现。就不在此列出。如有兴趣用Delphi实现的朋友，也可以找本人交流，本人盛感荣幸。<br>（当然如果是C++的朋友也同样、甚至更加欢迎）</p>
<p>&nbsp;看了这么多次的桥接模式，这次总算明白了。要想理解桥接模式，个人认为，还是有必要同抽象及其实现进行一下比较。<br>&nbsp;1) 抽象及实现。我相信，跟不同的人说话，都会有诀窍在里头。同是coder，相信，最默契的沟通，还是code吧。我们来看下抽象及其实现的代码。<br>//抽象基类声明<br>class AbstractClassX<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) = 0;<br>&nbsp;//xxx<br>}</p>
<p>//AbstractClassX的具体实现 ClassXImplX1<br>class ClassXImplX1 : public AbstractClassX<br>{<br>....<br>public:<br>&nbsp;void DoSomething(void){ // do something with method 1... }<br>}</p>
<p>//AbstractClassX的具体实现 ClassXImplX2<br>class ClassXImplX2 : public AbstractClassX<br>{<br>....<br>public:<br>&nbsp;void DoSomething(void){ // do something with method 2... }<br>}</p>
<p>&nbsp;在实际应用中，我们用的是抽象类。而实际上实例化的，却是某具体子类。这种实现被我们多数人所使用。而它实际上解决的只是这么一类问题，即：同一行为的不同表现。当<br>然大多数需求，用此就可以了。<br>&nbsp;但现在假如说有这么一种情况：假如说，上面的处理仅仅只适用于平台A，而用户却希望同时，它也要能够在平台B上也能够一样的操作。那当如何？<br>很明显的，此种需要，并不是行为上的需求，因为不论是在平台A上还是平台B上，都要执行相同的操作。而且表示也是一样的。该需要的实现。实际上是需要我们重新封装个抽象层，<br>来专门处理平台B上的该行为。而实际的实现，却还是跟平台A上的一样。其实我们仔细一想。其实平台A了的抽象（即：AbstractClassX）与平台B上的抽象（假如为：AbstractClassY），<br>其实它们是类似的。因为需要处理的功能一样。因此，我们就想，如果将这种抽象与实现具体分离开来。在抽象中，留个具体实现的抽象引用（此其实就是该模式所指的Bridge----即：桥<br>通过该桥，将抽象与具体的实现连接起来。因此，我想该模式的名称就是因此得来的吧）。那样。抽象可以不受限制的扩展，实现也同样可以不受限制的扩展。这样，系统的框架就不需要<br>更改，其不妙哉？！因此就有了如下的code</p>
<p>//******************************************************************<br>//* 抽象声明及抽象部分的实现<br>//******************************************************************<br>//抽象的抽象基类声明<br>class AbstractClass<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;AbstractImpl* m_pAIObj;&nbsp;//具体的抽象实现的抽象对象（这话很ao口，但理解了这话，也就理解了该模式。可以大言不惭地说，该模式的秘密就在这句话上）<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) = 0;<br>&nbsp;//xxx<br>}</p>
<p>//平台A上的抽象的具体实现(注意：此实现子类，是针对抽象的)<br>class AbstractClassA : public AbstractClass<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) { m_pAIObj.DoSomething(); }<br>&nbsp;//xxx<br>}</p>
<p>//平台B上的抽象的具体实现(注意：此实现子类，是针对抽象的)<br>class AbstractClassB : public AbstractClass<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) { m_pAIObj.DoSomething(); }<br>&nbsp;//xxx<br>}</p>
<p>//******************************************************************<br>//* 实现的抽象声明及其实现<br>//******************************************************************<br>//实现部分的抽象基类声明<br>class AbstractImplClass<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) = 0;<br>&nbsp;//xxx<br>}</p>
<p>//具体算法1的具体实现<br>class ImplX : public AbstractImplClass<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) { // do something... }<br>&nbsp;//xxx<br>}</p>
<p>//具体算法1的具体实现<br>class ImplY : public AbstractImplClass<br>{<br>private:<br>&nbsp;//xxx<br>protected:<br>&nbsp;//xxx<br>public:<br>&nbsp;//xxx<br>&nbsp;void DoSomething(void) { // do something... }<br>&nbsp;//xxx<br>}</p>
<p>//******************************************************************<br>//* 实际应用方面<br>//******************************************************************</p>
<p>int main(int argc, char* argv[])<br>{<br>&nbsp;AbstractImplClass* pImplObj = new ImplX();//或new ImplY();等等。<br>&nbsp;//下面注意下：因为上面的代码中，本人为了简写，并没有明确写出抽象部分的具体构造函数。<br>&nbsp;//相信，是程序员，看完下面这行都懂得，上面的抽象部分的声明，应该声明一个什么样的<br>&nbsp;//构造函数吧。<br>&nbsp;AbstractClass* pAbstractObj = new AbstractClassA(pImplObj);//或new AbstractClassB(pImplObj);等等。</p>
<p>&nbsp;//do other something...</p>
<p>&nbsp;//在此补充一点：有上面的设计，系统的框架将都无需修改。不论是实现的具体算法改变了，还是<br>&nbsp;//抽象的需求变动。程序都无需要修改框架代码，，仅仅只需要写个具体的实现类（不管是实现的实现类，还是<br>&nbsp;//抽象的实现类）即可。这就是桥接模式。<br>}</p>
<img src ="http://www.cppblog.com/Tongy0/aggbug/146440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-16 00:42 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/16/146440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之三</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/15/146415.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 15 May 2011 07:48:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/15/146415.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146415.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/15/146415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146415.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146415.html</trackback:ping><description><![CDATA[<p>设计模式学习总结之三</p>
<p>五：Prototype模式（即：原型模式）</p>
<p>&nbsp;此模式其实很简单，主要就是通过&#8220;克隆&#8221;的技术，来产生出新的对象来。其与抽象工厂模式以及Builder模式的区别是：抽象工厂模式式，主要用来产生多个有相互依赖关系的对象的创建。<br>而构建模式则主要用来处理一个复杂模块的一步步构建工作。原型模式，则注重通过自身，来复制出一份与自身一样的实例对象来。原型本身也有点类似一个抽象工厂。<br>&nbsp;原型模式常用的接口一般有：Clone(); Asign(); 还有拷贝构造函数。（对Delphi来说，主要还是前两种方法）</p>
<p>&nbsp;前面一至五，可被归纳为：创建型模式<br></p>
<img src ="http://www.cppblog.com/Tongy0/aggbug/146415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-15 15:48 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/15/146415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之二</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/15/146414.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 15 May 2011 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/15/146414.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146414.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/15/146414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146414.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146414.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">设计模式学习总结之二</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">三：Singleton模式（单实例模式）</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">&nbsp;顾名思义，即单例模式。其主要思想就是在项目中，仅创建一个实例对象。该对象的抽象，除了通过指定的获取实例接口外，再没其他办法可以初始化。<br>此可以保证整个系统生命周期内，仅会有一个实例存在。可以想象一下，它是可以与先前说的工厂模式或抽象工厂模式结合使用的。因为一般来说，工厂可能只会<br>有一个（至少对某种逻辑处理来说是这样的）。<br>&nbsp;在C++中，实现单例模式，相对比较直观及合理。将该实例定义成static成员即可。并提供获取及释放该成员的接口。而在delphi中，（就本来的了解来说）<br>似乎并没有直观的静态成员这一说法。但可以定义一个全局变量，并提供获取与释放变量的接口来模拟。（但，毕竟没办法同类型的实例被创建出来，所以最好要加<br>详细注释说明。告知其他组员，此为单实例）<br><br>&nbsp;参考的c++实现：<br>&nbsp;class CA<br>&nbsp;{<br>&nbsp;private:<br>&nbsp;&nbsp;CA(){}<br>&nbsp;private:<br>&nbsp;&nbsp;static CA* m_pAObj;<br>&nbsp;public:<br>&nbsp;&nbsp;virtual ~CA(){}<br>&nbsp;&nbsp;static CA* GetAObj(void)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if (m_pAObj == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pAObj = new CA();<br>&nbsp;&nbsp;&nbsp;return m_pAObj;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;static void SafeReleaseAObj(void)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if (m_pAObj != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;delete m_pAObj;<br>&nbsp;&nbsp;&nbsp;m_pAObj = NULL;<br>&nbsp;&nbsp;}<br>&nbsp;};<br>&nbsp;static CA* CA::m_pAObj = NULL;</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">&nbsp;参考的Delphi实现：<br>&nbsp;unit xxx<br>&nbsp;interface<br>&nbsp;uses<br>&nbsp;&nbsp; xxx,...,yyy;<br>&nbsp;type<br>&nbsp;&nbsp; TMyClass = class<br>&nbsp;&nbsp; //xxxx<br>&nbsp;&nbsp; end;<br>&nbsp;var<br>&nbsp;&nbsp; gAObj: TMyClass;//此为全局的单实例对象。<br>&nbsp;function GetAObj: TMyClass;<br>&nbsp;procedure SafeReleaseAObj;<br>&nbsp;implemention//这个单词忘了是不是这么写。反应是实现的那个单词。。<br>&nbsp;procedure SafeReleaseAObj;<br>&nbsp;begin<br>&nbsp;&nbsp; if Assigned(gAObj) then<br>&nbsp;&nbsp;&nbsp;&nbsp; FreeAndNil(gAObj);<br>&nbsp;end;<br>&nbsp;funciton GetAObj: TMyClass;<br>&nbsp;begin<br>&nbsp;&nbsp; if not Assigned(gAObj) then<br>&nbsp;&nbsp;&nbsp;&nbsp; gAObj = TMyClass.Create;<br>&nbsp;&nbsp; Result := gAObj;<br>&nbsp;end;</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">&nbsp;//说明：以上仅是临时写的，并未在程序中编译测试。但思路肯定不会错。可供参考用。<br>&nbsp;<br>四：Builder模式（即：构建模式）</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">&nbsp;往往在实际项目的开发过程中会发现，某些模块的功能过于复杂。此时，我们自然就会想到将其进行进一步的划分。如：细分成DA,DB,...,DN。然后由该模块的某个管理角色进行协调运作。<br>这样，Builder模式将可用在此设计上。其思想，就是将复杂问题进一步细化。</p>
<img src ="http://www.cppblog.com/Tongy0/aggbug/146414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-15 15:31 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/15/146414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习总结之一</title><link>http://www.cppblog.com/Tongy0/archive/2011/05/15/146406.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 15 May 2011 04:14:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/archive/2011/05/15/146406.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/146406.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/archive/2011/05/15/146406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/146406.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/146406.html</trackback:ping><description><![CDATA[<p>设计模式学习总结之一</p>
<p>&nbsp;设计模式其实只是一种程序设计的思想准则。通过该思想准则来指导我们的程序开发行为，尽量让开发的程序更加稳健、高效、思路清晰、少bug......<br>开发一程序项目，往往并不只限于单一地使用某一模式。往往会多种模式同时使用。</p>
<p>&nbsp;其实，设计模式在具体项目中的应用开发中。要说要用xxx/xxx模式来搭框架开发等等，这些都是不对的。因为个人认为，设计模式的应用，是随着项目的<br>不同而定的。因为不同的项目有着不同的解决方案。而不同的解决方案，将决定着，需要使用哪xxx/哪xxx模式来处理会比较好，此时才能说，确定了项目<br>的框架等等。<br>&nbsp;比如说：本来需要开发一个本地资源管理的项目。如果你一开始就给它定了一定要用单实例模式来搭框架实现。那我们就不明白了这个实例，在框架中，<br>到底它应该是什么。反过来，正常的，我们应该根据这个项目的需要来确定应该用到的模式。就拿该例子来说。我们可以对资源方面，使用抽象工栈模式<br>在资源与展现及其处理方面，我们可以应用观察模式（即：所谓的observer模式）。如此一来，我很明确了，该系统大置的框架。这正应了刚开始的一句话<br>：设计模式只是一种程序设计的思想准则，它只是用来指导程序开发的行为。</p>
<p>&nbsp;当然想懂得设计模式的东东，确实还是离不开面向对象（的思想）。对oo思想更解的越深刻，学起设计模式的将相对越轻松，也更解的会更深刻些（当然，<br>学习它将是个不断迭代的过程的）。反过来，对设计模式理解的越深刻，对oo的理解及应用与设计，也将大大有益。</p>
<p>一：Factory模式（工厂模式）</p>
<p>&nbsp;所谓的Factory模式，即：它能类似工厂一样，不断地产生（即：创建）&#8220;产品&#8221;出来。但它所创建出来的那些&#8220;产品&#8221;，一般是抽象类的产品。举例：<br>假如有抽象类AbstractBasicClass。我们要想使用它，必须得有它的实现类。按正常来说，我们可以直接通过其具体的子类实例化一个产品出来。但这样会<br>有个问题，当AbstractBasicClass拥有N种不同的实现子类时，那我们到底要使用哪种具体子类来实例化，并且，各个不同的具体实现子类的命名，也将是<br>个可怕的问题。因此这样的维护将变得十分复杂。而Factory的设计就可以起来很好的一个维护作用。其实Factory模式的设计，还有一个好处，就是使得实例<br>化得到了推迟（到了后期----一般指执行期）。</p>
<p>二：AbstractFactory模式（抽象工厂模式）</p>
<p>&nbsp;上面Factory模式，其实针对的是一类类的情况，即：处理的上上面的AbstractBasicClass这一类类的情况。而实际项目中，却往往需要处理N种的这样抽象类、<br>的情况。此时，我们将这N种类的产品创建都归到一个Factory中时，此时的Factory即为一个AbstractFactory了。因此说，Factory与AbstractFactory只不过<br>是处理的类各类的个数差异罢了。其思想是类似的。<br>&nbsp;但一般来说AbstractFactory所产生出来的种抽象类，其实它们之间，一般来说，或多或少，会是有一定的关系的。比如：一个Abstractfactory产生出两个<br>抽象类的产品A和B。则A可能就需要B的某些功能，反之类似。</p>
<p>&nbsp;小结：Factory与AbstractFactory的设计，最终的目的都只是为了使用系统抽象类的维护更加简单些。</p>
<img src ="http://www.cppblog.com/Tongy0/aggbug/146406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-05-15 12:14 <a href="http://www.cppblog.com/Tongy0/archive/2011/05/15/146406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>