﻿<?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++博客-jack-wang-随笔分类-设计模式</title><link>http://www.cppblog.com/jack-wang/category/12830.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 07 Aug 2011 00:45:01 GMT</lastBuildDate><pubDate>Sun, 07 Aug 2011 00:45:01 GMT</pubDate><ttl>60</ttl><item><title>常见设计模式的解析和实现(C++)之十四-Command模式</title><link>http://www.cppblog.com/jack-wang/archive/2011/08/05/152488.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Thu, 04 Aug 2011 17:50:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2011/08/05/152488.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/152488.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2011/08/05/152488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/152488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/152488.html</trackback:ping><description><![CDATA[<p><font color="#223355">转：<a href="http://www.cppblog.com/converse/archive/2006/08/04/10855.html">http://www.cppblog.com/converse/archive/2006/08/04/10855.html</a><br /></font></p>
<div class="postbody">作用:<br />将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.<br />UML结构图:<br /><img src="http://teddyma.cnblogs.com/images/cnblogs_com/teddyma/gof37.JPG"  alt="" /><br /><br />解析:<br />Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver类中,由调用这个命令的类也就是这里的Invoker类来调用.其实,如果弄清楚了Command模式的原理,就会发现其实它和注册回调函数的原理是很相似的,而在面向过程的设计中的回调函数其实和这里的Command类的作用是一致的.采用Command模式解耦了命令的发出者和命令的执行者.<br /><br />实现:<br />1)Command.h<br />
<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"><img id="Codehighlighter1_0_270_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_270_Open_Text.style.display='none'; Codehighlighter1_0_270_Closed_Image.style.display='inline'; Codehighlighter1_0_270_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_270_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_270_Closed_Text.style.display='none'; Codehighlighter1_0_270_Open_Image.style.display='inline'; Codehighlighter1_0_270_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_270_Closed_Text">/**/</span><span id="Codehighlighter1_0_270_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*******************************************************************<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;created:&nbsp;&nbsp;&nbsp;&nbsp;2006/08/04<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Command.h<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李创<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cppblog.com/converse/</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;&nbsp;Command模式的演示代码<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />********************************************************************</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#ifndef&nbsp;COMMAND_H<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;COMMAND_H</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Command<br /><img id="Codehighlighter1_324_387_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_387_Open_Text.style.display='none'; Codehighlighter1_324_387_Closed_Image.style.display='inline'; Codehighlighter1_324_387_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_324_387_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_324_387_Closed_Text.style.display='none'; Codehighlighter1_324_387_Open_Image.style.display='inline'; Codehighlighter1_324_387_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_324_387_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_324_387_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_354_355_Open_Image" onclick="this.style.display='none'; Codehighlighter1_354_355_Open_Text.style.display='none'; Codehighlighter1_354_355_Closed_Image.style.display='inline'; Codehighlighter1_354_355_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_354_355_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_354_355_Closed_Text.style.display='none'; Codehighlighter1_354_355_Open_Image.style.display='inline'; Codehighlighter1_354_355_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&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">Command()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_354_355_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_354_355_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&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;Execute()&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Receiver<br /><img id="Codehighlighter1_406_432_Open_Image" onclick="this.style.display='none'; Codehighlighter1_406_432_Open_Text.style.display='none'; Codehighlighter1_406_432_Closed_Image.style.display='inline'; Codehighlighter1_406_432_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_406_432_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_406_432_Closed_Text.style.display='none'; Codehighlighter1_406_432_Open_Image.style.display='inline'; Codehighlighter1_406_432_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_406_432_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_406_432_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Action();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Invoker<br /><img id="Codehighlighter1_450_550_Open_Image" onclick="this.style.display='none'; Codehighlighter1_450_550_Open_Text.style.display='none'; Codehighlighter1_450_550_Closed_Image.style.display='inline'; Codehighlighter1_450_550_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_450_550_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_450_550_Closed_Text.style.display='none'; Codehighlighter1_450_550_Open_Image.style.display='inline'; Codehighlighter1_450_550_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_450_550_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_450_550_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Invoker(Command&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pCommand);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">Invoker();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Invoke();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Command&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">m_pCommand;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateComand<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Command<br /><img id="Codehighlighter1_594_732_Open_Image" onclick="this.style.display='none'; Codehighlighter1_594_732_Open_Text.style.display='none'; Codehighlighter1_594_732_Closed_Image.style.display='inline'; Codehighlighter1_594_732_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_594_732_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_594_732_Closed_Text.style.display='none'; Codehighlighter1_594_732_Open_Image.style.display='inline'; Codehighlighter1_594_732_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_594_732_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_594_732_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ConcreateComand(Receiver</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pReceiver);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&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">ConcreateComand();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&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;Execute();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Receiver</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pReceiver;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span></div><br />2)Command.cpp<br />
<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"><img id="Codehighlighter1_0_272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_272_Open_Text.style.display='none'; Codehighlighter1_0_272_Closed_Image.style.display='inline'; Codehighlighter1_0_272_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_272_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_272_Closed_Text.style.display='none'; Codehighlighter1_0_272_Open_Image.style.display='inline'; Codehighlighter1_0_272_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_272_Closed_Text">/**/</span><span id="Codehighlighter1_0_272_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*******************************************************************<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;created:&nbsp;&nbsp;&nbsp;&nbsp;2006/08/04<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Command.cpp<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李创<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cppblog.com/converse/</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;&nbsp;Command模式的演示代码<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />********************************************************************</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Command.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Receiver::Action()<br /><img id="Codehighlighter1_341_379_Open_Image" onclick="this.style.display='none'; Codehighlighter1_341_379_Open_Text.style.display='none'; Codehighlighter1_341_379_Closed_Image.style.display='inline'; Codehighlighter1_341_379_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_341_379_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_341_379_Closed_Text.style.display='none'; Codehighlighter1_341_379_Open_Image.style.display='inline'; Codehighlighter1_341_379_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_341_379_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_341_379_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Receiver&nbsp;Action\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />Invoker::Invoker(Command&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pCommand)<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;m_pCommand(pCommand)<br /><img id="Codehighlighter1_442_445_Open_Image" onclick="this.style.display='none'; Codehighlighter1_442_445_Open_Text.style.display='none'; Codehighlighter1_442_445_Closed_Image.style.display='inline'; Codehighlighter1_442_445_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_442_445_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_442_445_Closed_Text.style.display='none'; Codehighlighter1_442_445_Open_Image.style.display='inline'; Codehighlighter1_442_445_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_442_445_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_442_445_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />Invoker::</span><span style="color: #000000">~</span><span style="color: #000000">Invoker()<br /><img id="Codehighlighter1_468_510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_510_Open_Text.style.display='none'; Codehighlighter1_468_510_Closed_Image.style.display='inline'; Codehighlighter1_468_510_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_468_510_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_468_510_Closed_Text.style.display='none'; Codehighlighter1_468_510_Open_Image.style.display='inline'; Codehighlighter1_468_510_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_468_510_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_468_510_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pCommand;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;m_pCommand&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Invoker::Invoke()<br /><img id="Codehighlighter1_536_594_Open_Image" onclick="this.style.display='none'; Codehighlighter1_536_594_Open_Text.style.display='none'; Codehighlighter1_536_594_Closed_Image.style.display='inline'; Codehighlighter1_536_594_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_536_594_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_536_594_Closed_Text.style.display='none'; Codehighlighter1_536_594_Open_Image.style.display='inline'; Codehighlighter1_536_594_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_536_594_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_536_594_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  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_pCommand)<br /><img id="Codehighlighter1_564_592_Open_Image" onclick="this.style.display='none'; Codehighlighter1_564_592_Open_Text.style.display='none'; Codehighlighter1_564_592_Closed_Image.style.display='inline'; Codehighlighter1_564_592_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_564_592_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_564_592_Closed_Text.style.display='none'; Codehighlighter1_564_592_Open_Image.style.display='inline'; Codehighlighter1_564_592_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_564_592_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_564_592_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pCommand</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Execute();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />ConcreateComand::ConcreateComand(Receiver</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pReceiver)<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;m_pReceiver(pReceiver)<br /><img id="Codehighlighter1_677_680_Open_Image" onclick="this.style.display='none'; Codehighlighter1_677_680_Open_Text.style.display='none'; Codehighlighter1_677_680_Closed_Image.style.display='inline'; Codehighlighter1_677_680_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_677_680_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_677_680_Closed_Text.style.display='none'; Codehighlighter1_677_680_Open_Image.style.display='inline'; Codehighlighter1_677_680_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_677_680_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_677_680_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />ConcreateComand::</span><span style="color: #000000">~</span><span style="color: #000000">ConcreateComand()<br /><img id="Codehighlighter1_719_763_Open_Image" onclick="this.style.display='none'; Codehighlighter1_719_763_Open_Text.style.display='none'; Codehighlighter1_719_763_Closed_Image.style.display='inline'; Codehighlighter1_719_763_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_719_763_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_719_763_Closed_Text.style.display='none'; Codehighlighter1_719_763_Open_Image.style.display='inline'; Codehighlighter1_719_763_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_719_763_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_719_763_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pReceiver;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;m_pReceiver&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ConcreateComand::Execute()<br /><img id="Codehighlighter1_798_905_Open_Image" onclick="this.style.display='none'; Codehighlighter1_798_905_Open_Text.style.display='none'; Codehighlighter1_798_905_Closed_Image.style.display='inline'; Codehighlighter1_798_905_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_798_905_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_798_905_Closed_Text.style.display='none'; Codehighlighter1_798_905_Open_Image.style.display='inline'; Codehighlighter1_798_905_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_798_905_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_798_905_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  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_pReceiver)<br /><img id="Codehighlighter1_827_855_Open_Image" onclick="this.style.display='none'; Codehighlighter1_827_855_Open_Text.style.display='none'; Codehighlighter1_827_855_Closed_Image.style.display='inline'; Codehighlighter1_827_855_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_827_855_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_827_855_Closed_Text.style.display='none'; Codehighlighter1_827_855_Open_Image.style.display='inline'; Codehighlighter1_827_855_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_827_855_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_827_855_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pReceiver</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Action();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Execute&nbsp;by&nbsp;ConcreateComand\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span></div><br />3)Main.cpp<br />
<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"><img id="Codehighlighter1_0_269_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_269_Open_Text.style.display='none'; Codehighlighter1_0_269_Closed_Image.style.display='inline'; Codehighlighter1_0_269_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_269_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_269_Closed_Text.style.display='none'; Codehighlighter1_0_269_Open_Image.style.display='inline'; Codehighlighter1_0_269_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_269_Closed_Text">/**/</span><span id="Codehighlighter1_0_269_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*******************************************************************<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;created:&nbsp;&nbsp;&nbsp;&nbsp;2006/08/04<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.cpp<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李创<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cppblog.com/converse/</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;&nbsp;Command模式的测试代码<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />********************************************************************</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Command.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_325_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_539_Open_Text.style.display='none'; Codehighlighter1_325_539_Closed_Image.style.display='inline'; Codehighlighter1_325_539_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_325_539_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_325_539_Closed_Text.style.display='none'; Codehighlighter1_325_539_Open_Image.style.display='inline'; Codehighlighter1_325_539_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_325_539_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_325_539_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Receiver</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pReceiver&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Receiver();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Command</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;pCommand&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateComand(pReceiver);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Invoker</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;pInvoker&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Invoker(pCommand);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pInvoker</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Invoke();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pInvoker;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000">"</span><span style="color: #000000">pause</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /></span></div></div><img src ="http://www.cppblog.com/jack-wang/aggbug/152488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2011-08-05 01:50 <a href="http://www.cppblog.com/jack-wang/archive/2011/08/05/152488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见设计模式的解析和实现(C++)之十二-ChainOfResponsibility模式 </title><link>http://www.cppblog.com/jack-wang/archive/2011/08/05/152487.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Thu, 04 Aug 2011 17:46:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2011/08/05/152487.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/152487.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2011/08/05/152487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/152487.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/152487.html</trackback:ping><description><![CDATA[转：<a href="http://www.cppblog.com/converse/archive/2006/07/28/10663.html">http://www.cppblog.com/converse/archive/2006/07/28/10663.html</a><br /><br />作用:<br />使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链，并沿着这条链传递该请求,直到有一个对象处理它为止.<br /><br />UML结构图:<br /><img src="http://teddyma.cnblogs.com/images/cnblogs_com/teddyma/gof36.JPG"  alt="" /><br /><br /><br />抽象基类:<br />1)Handler:定义一个处理请求的接口,在图中这个接口就是HandleRequset函数,这个类同时有一个指向Handler对象的指针,指向后续的处理请求的对象(如果有的话).<br /><br />解析:<br />这个模式把可以处理一个请求的对象以链的形式连在了一起,让这些对象都有处理请求的机会.好比原来看古装电视中经常看到皇宫中召见某人的时候,太监们(可以处理一个请求的对象)就会依次的喊:传XX...这样一直下去直到找到这个人为止.ChainOfResponsibility模式也是这样的处理请求的,如果有后续的对象可以处理,那么传给后续的对象处理,否则就自己处理请求.这样的设计把请求的发送者和请求这种的处理者解耦了,好比发号的皇帝不知道到底是哪个太监最后会找到他要找到的人一般,只管发出命令就OK了.<br /><br />实现:<br />1)ChainOfResponsibility.h<br />
<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"><img id="Codehighlighter1_0_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_298_Open_Text.style.display='none'; Codehighlighter1_0_298_Closed_Image.style.display='inline'; Codehighlighter1_0_298_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_298_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_298_Closed_Text.style.display='none'; Codehighlighter1_0_298_Open_Image.style.display='inline'; Codehighlighter1_0_298_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_298_Closed_Text">/**/</span><span id="Codehighlighter1_0_298_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*******************************************************************<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;created:&nbsp;&nbsp;&nbsp;&nbsp;2006/07/20<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChainOfResponsibility.h<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李创<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cppblog.com/converse/</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;&nbsp;ChainOfResponsibility模式的演示代码<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />********************************************************************</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#ifndef&nbsp;CHAINOFRESPONSIBILITY_H<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;CHAINOFRESPONSIBILITY_H</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;抽象基类,定义一个处理请求的接口</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Handler<br /><img id="Codehighlighter1_420_577_Open_Image" onclick="this.style.display='none'; Codehighlighter1_420_577_Open_Text.style.display='none'; Codehighlighter1_420_577_Closed_Image.style.display='inline'; Codehighlighter1_420_577_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_420_577_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_420_577_Closed_Text.style.display='none'; Codehighlighter1_420_577_Open_Image.style.display='inline'; Codehighlighter1_420_577_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_420_577_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_420_577_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Handler(Handler&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSuccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&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">Handler();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;纯虚函数,由派生类实现</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  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;HandleRequset()&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Handler</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pSuccessor;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateHandler1<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Handler<br /><img id="Codehighlighter1_623_768_Open_Image" onclick="this.style.display='none'; Codehighlighter1_623_768_Open_Text.style.display='none'; Codehighlighter1_623_768_Closed_Image.style.display='inline'; Codehighlighter1_623_768_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_623_768_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_623_768_Closed_Text.style.display='none'; Codehighlighter1_623_768_Open_Image.style.display='inline'; Codehighlighter1_623_768_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_623_768_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_623_768_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_701_702_Open_Image" onclick="this.style.display='none'; Codehighlighter1_701_702_Open_Text.style.display='none'; Codehighlighter1_701_702_Closed_Image.style.display='inline'; Codehighlighter1_701_702_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_701_702_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_701_702_Closed_Text.style.display='none'; Codehighlighter1_701_702_Open_Image.style.display='inline'; Codehighlighter1_701_702_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ConcreateHandler1(Handler&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSuccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL)&nbsp;:&nbsp;Handler(pSuccessor)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_701_702_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_701_702_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_733_734_Open_Image" onclick="this.style.display='none'; Codehighlighter1_733_734_Open_Text.style.display='none'; Codehighlighter1_733_734_Closed_Image.style.display='inline'; Codehighlighter1_733_734_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_733_734_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_733_734_Closed_Text.style.display='none'; Codehighlighter1_733_734_Open_Image.style.display='inline'; Codehighlighter1_733_734_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&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">ConcreateHandler1()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_733_734_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_733_734_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&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;HandleRequset();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateHandler2<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Handler<br /><img id="Codehighlighter1_814_959_Open_Image" onclick="this.style.display='none'; Codehighlighter1_814_959_Open_Text.style.display='none'; Codehighlighter1_814_959_Closed_Image.style.display='inline'; Codehighlighter1_814_959_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_814_959_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_814_959_Closed_Text.style.display='none'; Codehighlighter1_814_959_Open_Image.style.display='inline'; Codehighlighter1_814_959_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_814_959_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_814_959_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_892_893_Open_Image" onclick="this.style.display='none'; Codehighlighter1_892_893_Open_Text.style.display='none'; Codehighlighter1_892_893_Closed_Image.style.display='inline'; Codehighlighter1_892_893_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_892_893_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_892_893_Closed_Text.style.display='none'; Codehighlighter1_892_893_Open_Image.style.display='inline'; Codehighlighter1_892_893_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ConcreateHandler2(Handler&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSuccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL)&nbsp;:&nbsp;Handler(pSuccessor)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_892_893_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_892_893_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_924_925_Open_Image" onclick="this.style.display='none'; Codehighlighter1_924_925_Open_Text.style.display='none'; Codehighlighter1_924_925_Closed_Image.style.display='inline'; Codehighlighter1_924_925_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_924_925_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_924_925_Closed_Text.style.display='none'; Codehighlighter1_924_925_Open_Image.style.display='inline'; Codehighlighter1_924_925_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&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">ConcreateHandler2()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_924_925_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_924_925_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&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;HandleRequset();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span></div><br />2)ChainOfResponsibility.cpp<br />
<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"><img id="Codehighlighter1_0_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_300_Open_Text.style.display='none'; Codehighlighter1_0_300_Closed_Image.style.display='inline'; Codehighlighter1_0_300_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_300_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_300_Closed_Text.style.display='none'; Codehighlighter1_0_300_Open_Image.style.display='inline'; Codehighlighter1_0_300_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_300_Closed_Text">/**/</span><span id="Codehighlighter1_0_300_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*******************************************************************<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;created:&nbsp;&nbsp;&nbsp;&nbsp;2006/07/20<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChainOfResponsibility.cpp<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李创<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cppblog.com/converse/</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;&nbsp;ChainOfResponsibility模式的演示代码<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />********************************************************************</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ChainOfResponsibility.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_396_406_Open_Image" onclick="this.style.display='none'; Codehighlighter1_396_406_Open_Text.style.display='none'; Codehighlighter1_396_406_Closed_Image.style.display='inline'; Codehighlighter1_396_406_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_396_406_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_396_406_Closed_Text.style.display='none'; Codehighlighter1_396_406_Open_Image.style.display='inline'; Codehighlighter1_396_406_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">Handler::Handler(Handler&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSuccessor&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_396_406_Closed_Text">/**/</span><span id="Codehighlighter1_396_406_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;=&nbsp;NULL</span><span style="color: #008000">*/</span></span><span style="color: #000000">)&nbsp;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;m_pSuccessor(pSuccessor)<br /><img id="Codehighlighter1_438_440_Open_Image" onclick="this.style.display='none'; Codehighlighter1_438_440_Open_Text.style.display='none'; Codehighlighter1_438_440_Closed_Image.style.display='inline'; Codehighlighter1_438_440_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_438_440_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_438_440_Closed_Text.style.display='none'; Codehighlighter1_438_440_Open_Image.style.display='inline'; Codehighlighter1_438_440_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_438_440_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_438_440_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />Handler::</span><span style="color: #000000">~</span><span style="color: #000000">Handler()<br /><img id="Codehighlighter1_463_509_Open_Image" onclick="this.style.display='none'; Codehighlighter1_463_509_Open_Text.style.display='none'; Codehighlighter1_463_509_Closed_Image.style.display='inline'; Codehighlighter1_463_509_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_463_509_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_463_509_Closed_Text.style.display='none'; Codehighlighter1_463_509_Open_Image.style.display='inline'; Codehighlighter1_463_509_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_463_509_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_463_509_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pSuccessor;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;m_pSuccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ConcreateHandler1::HandleRequset()<br /><img id="Codehighlighter1_552_688_Open_Image" onclick="this.style.display='none'; Codehighlighter1_552_688_Open_Text.style.display='none'; Codehighlighter1_552_688_Closed_Image.style.display='inline'; Codehighlighter1_552_688_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_552_688_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_552_688_Closed_Text.style.display='none'; Codehighlighter1_552_688_Open_Image.style.display='inline'; Codehighlighter1_552_688_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_552_688_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_552_688_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  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_pSuccessor)<br /><img id="Codehighlighter1_582_618_Open_Image" onclick="this.style.display='none'; Codehighlighter1_582_618_Open_Text.style.display='none'; Codehighlighter1_582_618_Closed_Image.style.display='inline'; Codehighlighter1_582_618_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_582_618_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_582_618_Closed_Text.style.display='none'; Codehighlighter1_582_618_Open_Image.style.display='inline'; Codehighlighter1_582_618_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_582_618_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_582_618_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pSuccessor</span><span style="color: #000000">-&gt;</span><span style="color: #000000">HandleRequset();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_627_686_Open_Image" onclick="this.style.display='none'; Codehighlighter1_627_686_Open_Text.style.display='none'; Codehighlighter1_627_686_Closed_Image.style.display='inline'; Codehighlighter1_627_686_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_627_686_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_627_686_Closed_Text.style.display='none'; Codehighlighter1_627_686_Open_Image.style.display='inline'; Codehighlighter1_627_686_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_627_686_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_627_686_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">HandleRequset&nbsp;by&nbsp;ConcreateHandler1\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ConcreateHandler2::HandleRequset()<br /><img id="Codehighlighter1_731_867_Open_Image" onclick="this.style.display='none'; Codehighlighter1_731_867_Open_Text.style.display='none'; Codehighlighter1_731_867_Closed_Image.style.display='inline'; Codehighlighter1_731_867_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_731_867_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_731_867_Closed_Text.style.display='none'; Codehighlighter1_731_867_Open_Image.style.display='inline'; Codehighlighter1_731_867_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_731_867_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_731_867_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  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_pSuccessor)<br /><img id="Codehighlighter1_761_797_Open_Image" onclick="this.style.display='none'; Codehighlighter1_761_797_Open_Text.style.display='none'; Codehighlighter1_761_797_Closed_Image.style.display='inline'; Codehighlighter1_761_797_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_761_797_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_761_797_Closed_Text.style.display='none'; Codehighlighter1_761_797_Open_Image.style.display='inline'; Codehighlighter1_761_797_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_761_797_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_761_797_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pSuccessor</span><span style="color: #000000">-&gt;</span><span style="color: #000000">HandleRequset();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_806_865_Open_Image" onclick="this.style.display='none'; Codehighlighter1_806_865_Open_Text.style.display='none'; Codehighlighter1_806_865_Closed_Image.style.display='inline'; Codehighlighter1_806_865_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_806_865_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_806_865_Closed_Text.style.display='none'; Codehighlighter1_806_865_Open_Image.style.display='inline'; Codehighlighter1_806_865_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_806_865_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_806_865_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">HandleRequset&nbsp;by&nbsp;ConcreateHandler2\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span></div><br />3)Main.cpp<br />
<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"><img id="Codehighlighter1_0_283_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_283_Open_Text.style.display='none'; Codehighlighter1_0_283_Closed_Image.style.display='inline'; Codehighlighter1_0_283_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_283_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_283_Closed_Text.style.display='none'; Codehighlighter1_0_283_Open_Image.style.display='inline'; Codehighlighter1_0_283_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_283_Closed_Text">/**/</span><span id="Codehighlighter1_0_283_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*******************************************************************<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;created:&nbsp;&nbsp;&nbsp;&nbsp;2006/07/20<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.cpp<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;李创<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cppblog.com/converse/</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;purpose:&nbsp;&nbsp;&nbsp;&nbsp;ChainOfResponsibility模式的测试代码<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />********************************************************************</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ChainOfResponsibility.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_353_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_353_504_Open_Text.style.display='none'; Codehighlighter1_353_504_Closed_Image.style.display='inline'; Codehighlighter1_353_504_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_353_504_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_353_504_Closed_Text.style.display='none'; Codehighlighter1_353_504_Open_Image.style.display='inline'; Codehighlighter1_353_504_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_353_504_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_353_504_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Handler&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateHandler1();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Handler&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateHandler2(p1);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;p2</span><span style="color: #000000">-&gt;</span><span style="color: #000000">HandleRequset();<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;p2;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000">"</span><span style="color: #000000">pause</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /></span></div><img src ="http://www.cppblog.com/jack-wang/aggbug/152487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2011-08-05 01:46 <a href="http://www.cppblog.com/jack-wang/archive/2011/08/05/152487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Command模式</title><link>http://www.cppblog.com/jack-wang/archive/2010/01/16/105820.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Sat, 16 Jan 2010 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2010/01/16/105820.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/105820.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2010/01/16/105820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/105820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/105820.html</trackback:ping><description><![CDATA[<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/jack-wang/Command.JPG" width=640 height=512>
<img src ="http://www.cppblog.com/jack-wang/aggbug/105820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2010-01-16 16:27 <a href="http://www.cppblog.com/jack-wang/archive/2010/01/16/105820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter模式</title><link>http://www.cppblog.com/jack-wang/archive/2010/01/16/105811.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Sat, 16 Jan 2010 06:42:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2010/01/16/105811.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/105811.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2010/01/16/105811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/105811.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/105811.html</trackback:ping><description><![CDATA[<br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/jack-wang/Adapter2.JPG" width=640 height=512> 
<img src ="http://www.cppblog.com/jack-wang/aggbug/105811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2010-01-16 14:42 <a href="http://www.cppblog.com/jack-wang/archive/2010/01/16/105811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade模式</title><link>http://www.cppblog.com/jack-wang/archive/2010/01/16/105810.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Sat, 16 Jan 2010 06:32:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2010/01/16/105810.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/105810.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2010/01/16/105810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/105810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/105810.html</trackback:ping><description><![CDATA[没使用Facade模式前的程序结构：<br><br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/jack-wang/NotUsingFacade.JPG" width=640 height=512><br>使用Facade模式后的程序结构：<br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/jack-wang/UsingFacade.JPG" width=640 height=512>
<img src ="http://www.cppblog.com/jack-wang/aggbug/105810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2010-01-16 14:32 <a href="http://www.cppblog.com/jack-wang/archive/2010/01/16/105810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象工厂(Abstract Factory) </title><link>http://www.cppblog.com/jack-wang/archive/2009/01/02/70971.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Thu, 01 Jan 2009 20:23:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2009/01/02/70971.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/70971.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2009/01/02/70971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/70971.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/70971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 描述:&nbsp;&nbsp;&nbsp;&nbsp; 抽象工厂是一个适用于创建一系列相关的产品的创建性模型.比如设计模式书中经常讲的那个例子-支持多视感窗口的工具包,比如windows和motif风格,这个是风格族.每种风格下面都有些标准的产品族,象BUTTON, TextBox, ListBox等.试想一下,如果直接在client中指定具体产品和它的风格,那么会出现2*3 = 6中组合,如果新...&nbsp;&nbsp;<a href='http://www.cppblog.com/jack-wang/archive/2009/01/02/70971.html'>阅读全文</a><img src ="http://www.cppblog.com/jack-wang/aggbug/70971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2009-01-02 04:23 <a href="http://www.cppblog.com/jack-wang/archive/2009/01/02/70971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工厂方法（factory-method）模式</title><link>http://www.cppblog.com/jack-wang/archive/2009/01/02/70970.html</link><dc:creator>小王</dc:creator><author>小王</author><pubDate>Thu, 01 Jan 2009 20:22:00 GMT</pubDate><guid>http://www.cppblog.com/jack-wang/archive/2009/01/02/70970.html</guid><wfw:comment>http://www.cppblog.com/jack-wang/comments/70970.html</wfw:comment><comments>http://www.cppblog.com/jack-wang/archive/2009/01/02/70970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jack-wang/comments/commentRss/70970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jack-wang/services/trackbacks/70970.html</trackback:ping><description><![CDATA[<p><font size=5><span><span>一．<span> </span></span>工厂方法（factory-method）模式</span></font></p>
<p><strong>&nbsp;</strong></p>
<p><font size=4><span><span>1．<span> </span></span>意图</span></font></p>
<p><span>定义一个创建对象的接口，让子类决定实例化哪个产品类。工厂方法使一个对象的创建延迟到子类。</span></p>
<p>&nbsp;</p>
<p><font size=4><span><span>2．<span> </span></span>适用性</span></font></p>
<p><span>当一个类不知道它要创建的对象的类时。</span></p>
<p><span>当一个类希望由它的子类来决定创建哪个类的对象时。</span></p>
<p><span>当一个类决定将创建对象委托给多个子类，并且希望将那个子类是代理这一信息局部化的时候。</span></p>
<p>&nbsp;</p>
<p><font size=4><span><span>3．<span> </span></span>结构</span></font></p>
<p><img border=0 src="http://blog.vckbase.com/images/vckbase_com/fastzhao/wwww.jpg" width=650 height=458><br></p>
<p><font size=4><span><span>4．<span> </span></span>参与者</span></font></p>
<p><font size=4><strong><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Creater</span><span>：</span></strong></font></p>
<p><span>声明工厂方法的抽象类，工厂方法返回一个产品类（</span><span>Product</span><span>）。</span></p>
<p><span>可以调用工厂方法返回一个产品对象。</span></p>
<p>&nbsp;</p>
<p><font size=4><strong><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ConcreteCreater</span><span>：</span></strong></font></p>
<p><span>重定义工厂方法，以返回一个特定的</span><span>product</span><span>。</span></p>
<p>&nbsp;</p>
<p><font size=4><strong><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Product:</span></strong></font></p>
<p><span>产品抽象类，给用户提供一致的产品接口。</span></p>
<p>&nbsp;</p>
<p><font size=4><strong><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ConcreteProduct:</span></strong></font></p>
<p><span>特定的产品，实现</span><span>product</span><span>接口。</span></p>
<p>&nbsp;</p>
<p><font size=4><span><span>5．<span> </span></span>效果</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工厂方法将特定的类的实例化延迟到子类，而且返回</span><span>product</span><span>接口，使用户代码不用和具体类打交道，一致的对待</span><span>Product</span><span>。所以在用户要加入新产品的时候，无需更改客户代码，只需加入一个新的</span><span>ConcreteProduct</span><span>和</span><span>ConcreteCreater</span><span>即可，这个也是遵</span><span>&nbsp;</span><span>守了&#8220;开放封闭原则&#8221;。</span></p>
<p><span><span>&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>连接平行的类层次，上面的结构图中，</span><span>ConcreteCreater1</span><span>对应创</span><span>ConcreterProduct1</span><span>而</span><span>ConcreteCreater2</span><span>对应创建</span><span>ConcreterProduct2</span><span>。所以</span><span>creater</span><span>和</span><span>product</span><span>的类层次是平行的，用户只需选定一个</span><span>Creater</span><span>，就创建出对应</span><span>product</span><span>。像是一个</span><span>map</span><span>一样，不会出现牛头不对马嘴之态。</span></p>
<p>&nbsp;</p>
<p><font size=4><span><span>6．<span> </span></span>实现及变体</span></font></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></span></span><span>Creater</span><span>有两种实现，一种就是抽象的工厂方法，具体实现留到子类。另一种就是有一个缺省的实现，子类也可以重新实现这个方法。这种方法使用于真的有一个默认的</span><span>Product</span><span>需要实例化的这种情况。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带参数的工厂方法，这种情况可以创建多种产品，不过有个限制就是所有产品都要实现</span><span>product</span><span>接口，否则就失去工厂方法的意义了。代码如下：</span></p>
<p><span><font color=#000080>Product*&nbsp;ConcreteCreater1::FactoryMethod(int nID)</font></span></p>
<p><span><font color=#000080>{</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>If(nID ==&nbsp;BUTTON)</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new button;</font></span></p>
<p><span><font color=#000080>}</font></span></p>
<p><span><font color=#000080>Else if(nID ==&nbsp;BOX)</font></span></p>
<p><span><font color=#000080>{</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp; </span>return new box; </font></span></p>
<p><span><font color=#000080>}</font></span></p>
<p><span><font color=#000080>&#8230;</font></span></p>
<p><span><font color=#000080>}</font></span></p>
<p>&nbsp;</p>
<p><span>用模板实现，省略创建子类。</span></p>
<p><span>&nbsp;<font color=#000080>class Creater</font></span></p>
<p><span><font color=#000080>{</font></span></p>
<p><span><font color=#000080>public:</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual Product* FactoryMethod() = 0;</font></span></p>
<p><span><font color=#000080>};</font></span></p>
<p><span><font color=#000080>&nbsp;</font></span></p>
<p><span><font color=#000080>template&lt;class theProduct&gt;</font></span></p>
<p><span><font color=#000080>class TempCreater: public Creater</font></span></p>
<p><span><font color=#000080>{</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual Product* FactoryMethod();</font></span></p>
<p><span><font color=#000080>};</font></span></p>
<p><span><font color=#000080>&nbsp;</font></span></p>
<p><span><font color=#000080>&nbsp;</font></span></p>
<p><span><font color=#000080>template&lt;class theProduct&gt;</font></span></p>
<p><span><font color=#000080>Product* TempCreater&lt;theProduct&gt;::FactoryMethod()</font></span></p>
<p><span><font color=#000080>{</font></span></p>
<p><span><font color=#000080><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>return new theProduct;</font></span></p>
<p><span><font color=#000080>}</font></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用这个模版客户端只需定义产品，而不需定义</span><span>creater</span><span>的子类。</span></p>
<p>&nbsp;</p>
<p><font size=5><span><span>二．<span> </span></span>程序举例</span></font></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>在一个</span><span>ACT</span><span>游戏中，主角过关过程中有许多敌人，如狼（</span><span>wolf</span><span>）</span><span>,</span><span>蝙蝠（</span><span>bat</span><span>）</span><span>,</span><span>老怪（</span><span>BOSS</span><span>）</span><span>,</span><span>在每一关的刚开始就要创建许多不同的敌人，如果不用工厂方法，则把所有的创建任务都放在了客户代码中，则一个代码不易扩充和修改，二是代码很杂乱。而用了工厂方法则可以克服这两个缺点。比如你增加一个新的敌人</span><span>-</span><span>恐龙，则只需增加一个恐龙类（</span><span>ConcreteProduct</span><span>），再增加一个创建恐龙的类（</span><span>ConcreteCreater </span><span>）就</span><span>OK</span><span>了。<br><br></p>
<p><span>源码如下：</span></p>
<p align=left></span>&nbsp;</p>
<div>
<div><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><span>//</span><span>product&nbsp;abstract&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;Enemy<br><img id=Codehighlighter1_38_125_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_125_Open_Text.style.display='none'; Codehighlighter1_38_125_Closed_Image.style.display='inline'; Codehighlighter1_38_125_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_38_125_Closed_Image onclick="this.style.display='none'; Codehighlighter1_38_125_Closed_Text.style.display='none'; Codehighlighter1_38_125_Open_Image.style.display='inline'; Codehighlighter1_38_125_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_38_125_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_38_125_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif"></span><span>public</span><span>:<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>virtual</span>&nbsp;<span>void</span><span>&nbsp;attack()&nbsp;</span><span>=</span>&nbsp;<span>0</span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>virtual</span>&nbsp;<span>void</span><span>&nbsp;Draw()&nbsp;</span><span>=</span>&nbsp;<span>0</span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>virtual</span>&nbsp;<span>~</span><span>Enemy()&nbsp;</span><span>=</span>&nbsp;<span>0</span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;concrete&nbsp;product&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;Wolf&nbsp;:&nbsp;</span><span>public</span><span>&nbsp;Enemy<br><img id=Codehighlighter1_181_292_Open_Image onclick="this.style.display='none'; Codehighlighter1_181_292_Open_Text.style.display='none'; Codehighlighter1_181_292_Closed_Image.style.display='inline'; Codehighlighter1_181_292_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_181_292_Closed_Image onclick="this.style.display='none'; Codehighlighter1_181_292_Closed_Text.style.display='none'; Codehighlighter1_181_292_Open_Image.style.display='inline'; Codehighlighter1_181_292_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_181_292_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_181_292_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>void</span><span>&nbsp;attack()<br><img id=Codehighlighter1_199_239_Open_Image onclick="this.style.display='none'; Codehighlighter1_199_239_Open_Text.style.display='none'; Codehighlighter1_199_239_Closed_Image.style.display='inline'; Codehighlighter1_199_239_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_199_239_Closed_Image onclick="this.style.display='none'; Codehighlighter1_199_239_Closed_Text.style.display='none'; Codehighlighter1_199_239_Open_Image.style.display='inline'; Codehighlighter1_199_239_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_199_239_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_199_239_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span>&lt;&lt;</span>&nbsp;<span>"</span><span>Wolf&nbsp;attack&nbsp;me!</span><span>"</span>&nbsp;<span>&lt;&lt;</span><span>&nbsp;endl;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>void</span><span>&nbsp;Draw()<br><img id=Codehighlighter1_255_290_Open_Image onclick="this.style.display='none'; Codehighlighter1_255_290_Open_Text.style.display='none'; Codehighlighter1_255_290_Closed_Image.style.display='inline'; Codehighlighter1_255_290_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_255_290_Closed_Image onclick="this.style.display='none'; Codehighlighter1_255_290_Closed_Text.style.display='none'; Codehighlighter1_255_290_Open_Image.style.display='inline'; Codehighlighter1_255_290_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_255_290_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_255_290_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span>&lt;&lt;</span>&nbsp;<span>"</span><span>I&nbsp;am&nbsp;Wolf!</span><span>"</span>&nbsp;<span>&lt;&lt;</span><span>&nbsp;endl;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;concrete&nbsp;product&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;Bat&nbsp;:&nbsp;</span><span>public</span><span>&nbsp;Enemy<br><img id=Codehighlighter1_347_456_Open_Image onclick="this.style.display='none'; Codehighlighter1_347_456_Open_Text.style.display='none'; Codehighlighter1_347_456_Closed_Image.style.display='inline'; Codehighlighter1_347_456_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_347_456_Closed_Image onclick="this.style.display='none'; Codehighlighter1_347_456_Closed_Text.style.display='none'; Codehighlighter1_347_456_Open_Image.style.display='inline'; Codehighlighter1_347_456_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_347_456_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_347_456_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>void</span><span>&nbsp;attack()<br><img id=Codehighlighter1_365_404_Open_Image onclick="this.style.display='none'; Codehighlighter1_365_404_Open_Text.style.display='none'; Codehighlighter1_365_404_Closed_Image.style.display='inline'; Codehighlighter1_365_404_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_365_404_Closed_Image onclick="this.style.display='none'; Codehighlighter1_365_404_Closed_Text.style.display='none'; Codehighlighter1_365_404_Open_Image.style.display='inline'; Codehighlighter1_365_404_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_365_404_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_365_404_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span>&lt;&lt;</span>&nbsp;<span>"</span><span>Bat&nbsp;attack&nbsp;me!</span><span>"</span>&nbsp;<span>&lt;&lt;</span><span>&nbsp;endl;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>void</span><span>&nbsp;Draw()<br><img id=Codehighlighter1_420_454_Open_Image onclick="this.style.display='none'; Codehighlighter1_420_454_Open_Text.style.display='none'; Codehighlighter1_420_454_Closed_Image.style.display='inline'; Codehighlighter1_420_454_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_420_454_Closed_Image onclick="this.style.display='none'; Codehighlighter1_420_454_Closed_Text.style.display='none'; Codehighlighter1_420_454_Open_Image.style.display='inline'; Codehighlighter1_420_454_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_420_454_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_420_454_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span>&lt;&lt;</span>&nbsp;<span>"</span><span>I&nbsp;am&nbsp;Bat!</span><span>"</span>&nbsp;<span>&lt;&lt;</span><span>&nbsp;endl;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;concrete&nbsp;product&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;Boss&nbsp;:&nbsp;</span><span>public</span><span>&nbsp;Enemy<br><img id=Codehighlighter1_512_623_Open_Image onclick="this.style.display='none'; Codehighlighter1_512_623_Open_Text.style.display='none'; Codehighlighter1_512_623_Closed_Image.style.display='inline'; Codehighlighter1_512_623_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_512_623_Closed_Image onclick="this.style.display='none'; Codehighlighter1_512_623_Closed_Text.style.display='none'; Codehighlighter1_512_623_Open_Image.style.display='inline'; Codehighlighter1_512_623_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_512_623_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_512_623_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>void</span><span>&nbsp;attack()<br><img id=Codehighlighter1_530_570_Open_Image onclick="this.style.display='none'; Codehighlighter1_530_570_Open_Text.style.display='none'; Codehighlighter1_530_570_Closed_Image.style.display='inline'; Codehighlighter1_530_570_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_530_570_Closed_Image onclick="this.style.display='none'; Codehighlighter1_530_570_Closed_Text.style.display='none'; Codehighlighter1_530_570_Open_Image.style.display='inline'; Codehighlighter1_530_570_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_530_570_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_530_570_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span>&lt;&lt;</span>&nbsp;<span>"</span><span>Boss&nbsp;attack&nbsp;me!</span><span>"</span>&nbsp;<span>&lt;&lt;</span><span>&nbsp;endl;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>void</span><span>&nbsp;Draw()<br><img id=Codehighlighter1_586_621_Open_Image onclick="this.style.display='none'; Codehighlighter1_586_621_Open_Text.style.display='none'; Codehighlighter1_586_621_Closed_Image.style.display='inline'; Codehighlighter1_586_621_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_586_621_Closed_Image onclick="this.style.display='none'; Codehighlighter1_586_621_Closed_Text.style.display='none'; Codehighlighter1_586_621_Open_Image.style.display='inline'; Codehighlighter1_586_621_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_586_621_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_586_621_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span>&lt;&lt;</span>&nbsp;<span>"</span><span>I&nbsp;am&nbsp;Boss!</span><span>"</span>&nbsp;<span>&lt;&lt;</span><span>&nbsp;endl;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;creater&nbsp;abstract&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;EnemyCreater<br><img id=Codehighlighter1_672_709_Open_Image onclick="this.style.display='none'; Codehighlighter1_672_709_Open_Text.style.display='none'; Codehighlighter1_672_709_Closed_Image.style.display='inline'; Codehighlighter1_672_709_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_672_709_Closed_Image onclick="this.style.display='none'; Codehighlighter1_672_709_Closed_Text.style.display='none'; Codehighlighter1_672_709_Open_Image.style.display='inline'; Codehighlighter1_672_709_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_672_709_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_672_709_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>virtual</span><span>&nbsp;Enemy</span><span>*</span><span>&nbsp;CreateEnemy()&nbsp;</span><span>=</span>&nbsp;<span>0</span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;concrete&nbsp;creater&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;WolfCreater&nbsp;:&nbsp;</span><span>public</span><span>&nbsp;EnemyCreater<br><img id=Codehighlighter1_779_832_Open_Image onclick="this.style.display='none'; Codehighlighter1_779_832_Open_Text.style.display='none'; Codehighlighter1_779_832_Closed_Image.style.display='inline'; Codehighlighter1_779_832_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_779_832_Closed_Image onclick="this.style.display='none'; Codehighlighter1_779_832_Closed_Text.style.display='none'; Codehighlighter1_779_832_Open_Image.style.display='inline'; Codehighlighter1_779_832_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_779_832_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_779_832_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enemy</span><span>*</span><span>&nbsp;CreateEnemy()<br><img id=Codehighlighter1_806_830_Open_Image onclick="this.style.display='none'; Codehighlighter1_806_830_Open_Text.style.display='none'; Codehighlighter1_806_830_Closed_Image.style.display='inline'; Codehighlighter1_806_830_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_806_830_Closed_Image onclick="this.style.display='none'; Codehighlighter1_806_830_Closed_Text.style.display='none'; Codehighlighter1_806_830_Open_Image.style.display='inline'; Codehighlighter1_806_830_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_806_830_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_806_830_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span>&nbsp;<span>new</span><span>&nbsp;Wolf;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;concrete&nbsp;creater&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;BatCreater&nbsp;:&nbsp;</span><span>public</span><span>&nbsp;EnemyCreater<br><img id=Codehighlighter1_901_953_Open_Image onclick="this.style.display='none'; Codehighlighter1_901_953_Open_Text.style.display='none'; Codehighlighter1_901_953_Closed_Image.style.display='inline'; Codehighlighter1_901_953_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_901_953_Closed_Image onclick="this.style.display='none'; Codehighlighter1_901_953_Closed_Text.style.display='none'; Codehighlighter1_901_953_Open_Image.style.display='inline'; Codehighlighter1_901_953_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_901_953_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_901_953_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enemy</span><span>*</span><span>&nbsp;CreateEnemy()<br><img id=Codehighlighter1_928_951_Open_Image onclick="this.style.display='none'; Codehighlighter1_928_951_Open_Text.style.display='none'; Codehighlighter1_928_951_Closed_Image.style.display='inline'; Codehighlighter1_928_951_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_928_951_Closed_Image onclick="this.style.display='none'; Codehighlighter1_928_951_Closed_Text.style.display='none'; Codehighlighter1_928_951_Open_Image.style.display='inline'; Codehighlighter1_928_951_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_928_951_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_928_951_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span>&nbsp;<span>new</span><span>&nbsp;Bat;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>//</span><span>&nbsp;concrete&nbsp;creater&nbsp;class</span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>class</span><span>&nbsp;BossCreater&nbsp;:&nbsp;</span><span>public</span><span>&nbsp;EnemyCreater<br><img id=Codehighlighter1_1023_1076_Open_Image onclick="this.style.display='none'; Codehighlighter1_1023_1076_Open_Text.style.display='none'; Codehighlighter1_1023_1076_Closed_Image.style.display='inline'; Codehighlighter1_1023_1076_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_1023_1076_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1023_1076_Closed_Text.style.display='none'; Codehighlighter1_1023_1076_Open_Image.style.display='inline'; Codehighlighter1_1023_1076_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_1023_1076_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_1023_1076_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enemy</span><span>*</span><span>&nbsp;CreateEnemy()<br><img id=Codehighlighter1_1050_1074_Open_Image onclick="this.style.display='none'; Codehighlighter1_1050_1074_Open_Text.style.display='none'; Codehighlighter1_1050_1074_Closed_Image.style.display='inline'; Codehighlighter1_1050_1074_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_1050_1074_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1050_1074_Closed_Text.style.display='none'; Codehighlighter1_1050_1074_Open_Image.style.display='inline'; Codehighlighter1_1050_1074_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1050_1074_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_1050_1074_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span>&nbsp;<span>new</span><span>&nbsp;Boss;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/None.gif"></span><span>int</span><span>&nbsp;main(</span><span>int</span><span>&nbsp;argc,&nbsp;</span><span>char</span><span>*</span><span>&nbsp;argv[])<br><img id=Codehighlighter1_1114_1441_Open_Image onclick="this.style.display='none'; Codehighlighter1_1114_1441_Open_Text.style.display='none'; Codehighlighter1_1114_1441_Closed_Image.style.display='inline'; Codehighlighter1_1114_1441_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_1114_1441_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1114_1441_Closed_Text.style.display='none'; Codehighlighter1_1114_1441_Open_Image.style.display='inline'; Codehighlighter1_1114_1441_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span id=Codehighlighter1_1114_1441_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_1114_1441_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;EnemyCreater</span><span>*</span><span>&nbsp;enemyCreater[</span><span>3</span><span>];<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;enemyCreater[</span><span>0</span><span>]&nbsp;</span><span>=</span>&nbsp;<span>new</span><span>&nbsp;WolfCreater;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;enemyCreater[</span><span>1</span><span>]&nbsp;</span><span>=</span>&nbsp;<span>new</span><span>&nbsp;BatCreater;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;enemyCreater[</span><span>2</span><span>]&nbsp;</span><span>=</span>&nbsp;<span>new</span><span>&nbsp;BossCreater;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Enemy</span><span>*</span><span>&nbsp;cruEnemy&nbsp;</span><span>=</span><span>&nbsp;NULL;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>for</span><span>(</span><span>int</span><span>&nbsp;i&nbsp;&nbsp;</span><span>=</span>&nbsp;<span>0</span><span>;&nbsp;i&nbsp;</span><span>&lt;</span>&nbsp;<span>3</span><span>;&nbsp;</span><span>++</span><span>i)<br><img id=Codehighlighter1_1316_1428_Open_Image onclick="this.style.display='none'; Codehighlighter1_1316_1428_Open_Text.style.display='none'; Codehighlighter1_1316_1428_Closed_Image.style.display='inline'; Codehighlighter1_1316_1428_Closed_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_1316_1428_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1316_1428_Closed_Text.style.display='none'; Codehighlighter1_1316_1428_Open_Image.style.display='inline'; Codehighlighter1_1316_1428_Open_Text.style.display='inline';" align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1316_1428_Closed_Text><img src="http://blog.vckbase.com/Images/dot.gif"></span><span id=Codehighlighter1_1316_1428_Open_Text><span>{<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cruEnemy&nbsp;</span><span>=</span><span>&nbsp;enemyCreater[i].CreateEnemy();<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cruEnemy</span><span>-&gt;</span><span>Draw();<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cruEnemy</span><span>-&gt;</span><span>attack();<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;cruEnemy;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span>&nbsp;<span>0</span><span>;<br><img align=top src="http://blog.vckbase.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span>&nbsp;</div>
</div>
<p align=left><br>&nbsp;</p>
<p><font size=5><span><span>三．<span> </span></span>相关模式</span></font></p>
<p align=left><span>&nbsp;Abstract Factory</span><span>经常用工厂方法来实现。</span></p>
<p align=left><span>&nbsp;工厂方法通常在</span><span>Template Methods</span><span>中被调用。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>Prototypes</span><span>不需要创建</span><span>Creater</span><span>的子类。但是，它们通常要求一个针对</span><span>Product</span><span>类的</span><span>Initialize</span><span>操作。</span><span>Creater</span><span>使用</span><span>Initialize</span><span>来初始化对象。而</span><span>Factory Method</span><span>不需要这样的操作。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><strong>&nbsp;</strong></p>
<p><font size=5><span><span>四．<span> </span></span>参考文献</span></font></p>
<p><span>&nbsp;</span></p>
<p><span>&nbsp;</span><font size=4><span>《<font size=3>设计模式精解》</font></span></font><font size=3><span> </span><span>清华大学出版社，</span><span> </span><span>熊杰译。</span></font></p>
<p align=left><font size=3><span>&nbsp; 《设计模式可复用面向对象软件的基础》</span><span> </span><span>机械工业出版社，</span><span> </span><span>四人团著。</span></font></p>
<img src ="http://www.cppblog.com/jack-wang/aggbug/70970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jack-wang/" target="_blank">小王</a> 2009-01-02 04:22 <a href="http://www.cppblog.com/jack-wang/archive/2009/01/02/70970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>