﻿<?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++博客-jokes000</title><link>http://www.cppblog.com/jokes000/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:08:12 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:08:12 GMT</pubDate><ttl>60</ttl><item><title>基于契约设计DBC(Designed by contract)</title><link>http://www.cppblog.com/jokes000/archive/2011/10/25/159030.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Tue, 25 Oct 2011 01:58:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/25/159030.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/159030.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/25/159030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/159030.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/159030.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 使用DBC，类的编写者显式地规定针对该类的契约。客户代码的编写者可以通过该契约获悉可以依赖的行为方式。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;契约是通过为每个方法声明的前置条件和后置条件来指定的要使一个方法得以执行，前置条件必须要为真。执行完毕后，该方法要保证后置条件为真。<br /><br />&nbsp; &nbsp; &nbsp; 派生类的前置条件和后置条件的规则是：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在重新声明派生类中的例程时，只能使用相等或者更弱的前置条件来替换原始的前置条件，只能使用相等或者更强的后置条件来替换原始的后置条件。换句话说，当通过基类的接口使用对象时，用户只知道基类的前置条件和后置条件。因此，派生类对象不能期望这些用户遵从比基类更强的前置条件。也就是说，它们必须接受基类可以接受的一切。同时，派生类必须和基类的所有后置条件一直。也就是说，它们的行为方式和输出不能违反基类已经确立的任何限制。基类的用户不应被派生类的输出扰乱。<img src ="http://www.cppblog.com/jokes000/aggbug/159030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-25 09:58 <a href="http://www.cppblog.com/jokes000/archive/2011/10/25/159030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--访问者模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/17/158539.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 17 Oct 2011 07:08:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/17/158539.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158539.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/17/158539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158539.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158539.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Visitor.txt">/Files/jokes000/Visitor.txt</a><br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/访问者模式-男人女人03.rar">/Files/jokes000/访问者模式-男人女人03.rar</a><br /><br />&nbsp; &nbsp; &nbsp; 访问者模式（Visitor）：表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。<br /><br />&nbsp; &nbsp; &nbsp; 访问者模式适用于<span style="color: red; ">数据结构相对稳定</span>的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由地演化。<br /><br />&nbsp; &nbsp; &nbsp; 目的：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: red; ">把处理从数据结构分离出来。</span>如果系统有比较稳定的数据结构，又有易于变化的算法的话，使用访问者模式就是比较合适的，因为访问者模式使得算法操作的增加变得容易。<br /><br />&nbsp; &nbsp; &nbsp; 缺点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使得增加新的数据结构变得困难了。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/访问者模式结构图.jpg" width="733" height="555" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-17 15:08 <a href="http://www.cppblog.com/jokes000/archive/2011/10/17/158539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--解释器模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/17/158535.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 17 Oct 2011 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/17/158535.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158535.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/17/158535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158535.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158535.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/interpreter.txt">/Files/jokes000/interpreter.txt</a><br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/解释器模式-乐谱解释控件台实现.rar">/Files/jokes000/解释器模式-乐谱解释控件台实现.rar</a><br />&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; 解释器模式（interpreter）：给定一个语言，定义它的文法的一种表示，并定义一个解释器，这个解释器使用该表示来解释语言中的句子。<br /><br />&nbsp; &nbsp; &nbsp; 解释器模式需要解决的是：如果一个特定类型的问题发生的频率足够高，那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器，该解释器通过解释这些句子来解决该问题。<br /><br />&nbsp; &nbsp; &nbsp; 什么时候使用？<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当有一个语言需要解释执行，并且你可将该语言中的句子表示为一个抽象语法树时，可使用解释器模式。<br /><br />&nbsp; &nbsp; &nbsp; 好处：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可以容易地改变和扩展文法，因为该模式使用类来表示文法规则，你可使用继承来改变或扩展该文法。也比较容易实现文法，因为定义抽象语法树中各个节点的类的实现大体相似，这些类都易于直接编写。<br /><br />&nbsp; &nbsp; &nbsp; 不足： &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解释器模式为文法中的每一条规则至少定义了一个类，因此包含很多规则的文法可能难以维护和管理。建议当文法非常复杂时，使用其他的技术如语法分析程序或编译器生成器来处理。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp; &nbsp; &nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/解释器模式结构图.jpg" width="618" height="503" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-17 14:18 <a href="http://www.cppblog.com/jokes000/archive/2011/10/17/158535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--享元模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/17/158531.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 17 Oct 2011 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/17/158531.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158531.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/17/158531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158531.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Flyweight.txt">/Files/jokes000/Flyweight.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 享元模式（Flyweight）：运用共享技术有效地支持大量细粒度的对象。<br /><br />&nbsp; &nbsp; &nbsp; 在享元内部并且不会随环境改变而改变的共享部分，可以称为是享元对象的内部状态，而随环境改变而改变的、不可共享的状态就是外部状态了。<br /><br />&nbsp; &nbsp; &nbsp; 享元模式可以避免大量非常相似的开销。在程序设计中，有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的，有时就能够大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面，在方法调用时将它们传递进来，就可以通过共享大幅度地减少单个实例的数目。<br /><br />&nbsp; &nbsp; &nbsp; 什么时候使用？<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果一个应用程序使用了大量的对象，而大量的这些对象造成了很大的存储开销时就应该考虑使用；还有就是对象的大多数状态可以外部状态，如果删除对象的外部状态，那么可以用相对较少的共享对象取代很多组对象，此时可以考虑使用享元模式。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/享元模式结构图.jpg" width="855" height="562" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-17 13:48 <a href="http://www.cppblog.com/jokes000/archive/2011/10/17/158531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--中介者模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158488.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 12:23:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158488.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158488.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158488.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Mediator.txt">/Files/jokes000/Mediator.txt</a><br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/Mediator.rar">/Files/jokes000/Mediator.rar</a><br /><br />&nbsp; &nbsp; &nbsp; 中介者模式（Mediator）：用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用，从而使其松耦合松散，而且可以独立地改变它们之间的交互。<br /><br />&nbsp; &nbsp; &nbsp; 中介者模式很容易在系统中应用，也很容易在系统同误用。当系统出现了&#8217;多对多&#8216;交互复杂的对象群时，不要急于使用中介者模式，而要先反思你在系统设计上是否合理。<br /><br />&nbsp; &nbsp; &nbsp; 优点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A.Mediator的出现减少了哥哥Colleague的耦合，使得可以独立地改变和复用各个Colleague类和Mediator。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B.由于把对象如何协作进行了抽象，将中介作为一个独立的概念并将其封装在一个对象中，这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来，也就是站在一个更宏观的角度去看待系统。<br /><br />&nbsp; &nbsp; &nbsp; 缺点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由于ConcreteMediator控制集中化，于是就把交互复杂性变为了中介者的复杂性，这就使得中介者会变得比任何一个ConcreteColleague都复杂。<br /><br />&nbsp; &nbsp; &nbsp; 什么时候用？<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合，以及想定制一个分部在多个类中的行为，而又不想产生太多的子类的场合。<br /><br />&nbsp; &nbsp; &nbsp; 结构图:<br />&nbsp; &nbsp; &nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/中介者模式结构图.jpg" width="751" height="514" alt="" /><br /><br /><a></a><img src ="http://www.cppblog.com/jokes000/aggbug/158488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-16 20:23 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--职责链模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158479.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 10:47:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158479.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158479.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158479.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/ChainofResponsibility.txt">/Files/jokes000/ChainofResponsibility.txt</a><br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/ChainOfResponsibility.rar">/Files/jokes000/ChainOfResponsibility.rar</a><br /><br />&nbsp; &nbsp; &nbsp; 职责链模式(Chain of Responsibility)：使多个对象都有机会处理请求，从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它位置。<br /><br />&nbsp; &nbsp; &nbsp; 优点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当客户提交一个请求时，请求是沿链传递直至有一个ConcreteHandler对象负责处理它。<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 接受者和发送者都没有对方的明确信息，且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接，它们仅需保持一个指向其后继者的引用，而不需保持它所有的候选接受者的引用。<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。<br /><br />&nbsp; &nbsp; &nbsp; 当心！：一个请求极有可能到了链的末端都得不到处理，或者因为没有正确配置而得不到处理。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/职责链模式结构图.jpg" width="555" height="493" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-16 18:47 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>虚析构函数</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158478.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 10:39:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158478.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158478.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158478.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 自动调用基类部分的西沟函数对基类的设计有重要影响。<br /><br />&nbsp; &nbsp; &nbsp; 删除指向动态分配对象的指针时，需要运行西沟函数在释放对象的内存之前清楚对象。处理继承层次中的对象时，指针的静态类型可能与被删除对象的动态类型不同，可能会删除实际指向派生类对象的基类类型指针。<br />&nbsp; &nbsp; &nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果删除基类指针，则需要运行积累西沟函数并清楚基类成员，如果对象实际是派生类型的，则没有定义该行为。要保证运行适当的析构函数，基类中的析构函数必须为虚函数：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_183918" onclick="this.style.display='none'; Code_Closed_Text_183918.style.display='none'; Code_Open_Image_183918.style.display='inline'; Code_Open_Text_183918.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_183918" style="display: none" onclick="this.style.display='none'; Code_Open_Text_183918.style.display='none'; Code_Closed_Image_183918.style.display='inline'; Code_Closed_Text_183918.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_183918" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Code</span><span id="Code_Open_Text_183918" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;item_base<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;no&nbsp;work,&nbsp;but&nbsp;virtual&nbsp;destructor&nbsp;needed<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;base&nbsp;pointer&nbsp;that&nbsp;points&nbsp;to&nbsp;a&nbsp;derived&nbsp;object&nbsp;is&nbsp;ever&nbsp;deleted</span><span style="color: #008000; "><br /></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: #000000; ">~</span><span style="color: #000000; ">item_base()&nbsp;{}<br />};<br /><br />item_base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">itemP&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;item_base;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;same&nbsp;static&nbsp;and&nbsp;dynamic&nbsp;type</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">delete&nbsp;itemP;&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 style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ok:&nbsp;destructor&nbsp;for&nbsp;item_base&nbsp;called</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">itemP&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Bulk_item;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ok:&nbsp;static&nbsp;and&nbsp;dynamic&nbsp;types&nbsp;differ</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">delete&nbsp;itemP;&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 style="color: #008000; ">//</span><span style="color: #008000; "></span></span></div><img src ="http://www.cppblog.com/jokes000/aggbug/158478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-16 18:39 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--命令模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158472.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158472.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158472.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158472.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Command.txt">/Files/jokes000/Command.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 命令模式（Command）：将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤销的操作。<br /><br />&nbsp; &nbsp; &nbsp; 优点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.它能较容易地设计一个命令队列；<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.在需要的情况下，可以较容易地将命令记入日志；<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.允许接收请求的一方决定是否要否决请求；<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.可以容易地实现对请求的撤销和重做；<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.由于加进新的具体命令类不影响其他的类，因此增加新的具体命令很容易。<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 关键：命令模式把请求一个操作的对象与指导怎么执行一个操作的对象分割开。<br /><br />&nbsp; &nbsp; &nbsp; 敏捷开发原则告诉我们，不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式，一般就不不要急着去实现它，事实上，在需要的时候通过重构实现这个模式并不困难，只有在真正需要如撤销/恢复操作等功能时，把原来的代码重构为命令模式才有意义。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/命令模式结构图.jpg" width="757" height="545" alt="" /><br /><img src ="http://www.cppblog.com/jokes000/aggbug/158472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-16 17:32 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合成/聚合原则</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158454.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158454.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158454.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158454.html</trackback:ping><description><![CDATA[<div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;合成/聚合复用原则(CARP)，尽量使用合成/聚合，尽量不要使用类继承。</div><div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;合成和聚合都是关联的特殊种类。聚合表示一种若得&#8216;拥有&#8217;关系，体现的是A对象可以包含B对象，但B对象不是A对象的一部分；合成则是一种强的&#8216;拥有&#8217;关系，体现了严格的部分和整体的关系，部分和整体的生命周期一样。</div><div></div><div>好处：</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优先使用对象的合成/聚合将有助于你保持每个类被封装，并被集中在单个任务上。这样的类和类继承层次会保持较小的规模，并且不太可能增长为不可控制的庞然大物。</div></div><img src ="http://www.cppblog.com/jokes000/aggbug/158454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-16 16:12 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--桥接模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158453.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158453.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158453.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158453.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158453.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Bridge.txt">/Files/jokes000/Bridge.txt</a><br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/Code.rar">/Files/jokes000/Code.rar</a><br />&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; 桥接模式（Bridge）：将抽象部分与它的实现部分分离，使他们都可以独立地变化。这里需要理解一下，什么叫抽象与它的实现分离，这并不是说，让抽象类与派生类分离，因为这并没有任何意义。实际指的是抽象类和它的派生类用来实现自己的对象。<br /><br />&nbsp; &nbsp; &nbsp; 实现系统可能有多角度分类，每一种分类都有可能变化，那么就把这种多角度分离出来让它们独立变化，减少它们之间的耦合。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/桥接模式结构图.jpg" width="739" height="387" alt="" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.cppblog.com/jokes000/aggbug/158453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jokes000/" target="_blank">Voices.</a> 2011-10-16 16:08 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>