﻿<?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-随笔分类-Design Pattern</title><link>http://www.cppblog.com/jokes000/category/17895.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 18 Oct 2011 04:18:11 GMT</lastBuildDate><pubDate>Tue, 18 Oct 2011 04:18:11 GMT</pubDate><ttl>60</ttl><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/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><item><title>设计模式--单例模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/16/158438.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158438.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158438.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158438.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158438.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Singleton.txt">/Files/jokes000/Singleton.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 单例模式（Singleton）：保证一个类仅有一个实例，并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问，但不能防止你实例化多个对象。一个最好的方法就是，让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建，并且它可以提供一个访问该实例的方法。<br /><br />&nbsp; &nbsp; &nbsp; 单例模式因为Singleton类封装它的唯一实例，这样它可以严格地控制客户怎样访问它以及何时访问它。<br /><br />&nbsp; &nbsp; &nbsp; 注意：！！！<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多线程程序中，多个程序同时，注意是同时！访问Singleton类，调用GetInstance()方法，会有可能造成创建多个实例。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<a></a><img src ="http://www.cppblog.com/jokes000/aggbug/158438.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 11:16 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158438.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/158428.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 16 Oct 2011 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/16/158428.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158428.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/16/158428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158428.html</trackback:ping><description><![CDATA[代码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本：<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合模式(Composite)：将对象组合成树形结构以表示&#8220;部分-整体&#8221;的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;什么时候使用？<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需求中是体现部分与整体层次的结构，以及你希望用户可以忽略组合对象与单个对象的不同，统一地使用组合结构中的所有对象时，就应该考虑使用组合模式了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合模式定义了包含基本对象和组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象，而这个组合对象又可以被组合，这样不断地递归下去，客户代码中，任何用到基本对象的地方都可以使用组合对象了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户不用关心到底是处理一个叶节点还是处理一个组合组件，也就用不着为定义组合而写一些选择判断语句了。组合模式让客户可以一致的使用组合结构和单个对象。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.cppblog.com/jokes000/aggbug/158428.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 08:42 <a href="http://www.cppblog.com/jokes000/archive/2011/10/16/158428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--备忘录模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/15/158406.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sat, 15 Oct 2011 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/15/158406.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158406.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/15/158406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158406.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158406.html</trackback:ping><description><![CDATA[代码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本：<a href="/Files/jokes000/Memento.txt">/Files/jokes000/Memento.txt</a><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;备忘录(Memento)模式：在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可将该对象恢复到原来保存的状态。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;什么时候用？<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memento模式比较适用于功能比较复杂的，但需要维护或记录属性历史的类，或者需要保存的属性指示众多属性中的一小部分时，Originator可以根据保存的Memento信息还原到前一状态。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height="257" alt="" src="http://www.cppblog.com/images/cppblog_com/jokes000/备忘录模式结构图.jpg" width="872" border="0" longdesc="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158406.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-15 23:36 <a href="http://www.cppblog.com/jokes000/archive/2011/10/15/158406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--适配器模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/15/158382.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sat, 15 Oct 2011 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/15/158382.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158382.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/15/158382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158382.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/Adapter.rar">/Files/jokes000/Adapter.rar</a><br />&nbsp; &nbsp; &nbsp; 基本：<br /><span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; "><img id="Code_Closed_Image_215916" onclick="this.style.display='none'; Code_Closed_Text_215916.style.display='none'; Code_Open_Image_215916.style.display='inline'; Code_Open_Text_215916.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><span id="Code_Closed_Text_215916" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Adapter</span></span><br /><br /><br />&nbsp; &nbsp; &nbsp; 适配器模式：将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。<br /><br />&nbsp; &nbsp; &nbsp; 什么时候使用？<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要应用于希望复用一些现存的类，但是接口又与复用环境要求不一致的情况。（姚明--英语翻译）<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/适配器模式结构图.jpg" width="714" height="427" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158382.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-15 22:01 <a href="http://www.cppblog.com/jokes000/archive/2011/10/15/158382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--状态模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/15/158373.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sat, 15 Oct 2011 11:20:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/15/158373.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158373.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/15/158373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158373.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 实例：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/State.txt">/Files/jokes000/State.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 状态模式：当一个对象的内在状态改变时允许改变其行为，这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中，可以把复杂的判断逻辑简化。<br /><br />&nbsp; &nbsp; &nbsp; 优点：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将与特定状态相关的行为局部化，并且将不同状态的行为分割开来。<span style="color: red; ">（消除庞大的条件分支语句）</span><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将特定的状态相关的行为对放入一个对象中，由于所有与状态相关的代码都存在于某个ConcreteState中，所以通过定义新的子类可以很容易地增加新的状态和转换。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 状态模式通过把各种状态转移逻辑分布到State的子类之间，来减少相互间的依赖。<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="697" height="511" alt="" /><br /><br /><br /><br /><img src ="http://www.cppblog.com/jokes000/aggbug/158373.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-15 19:20 <a href="http://www.cppblog.com/jokes000/archive/2011/10/15/158373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--抽象工厂模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/15/158367.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sat, 15 Oct 2011 09:21:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/15/158367.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158367.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/15/158367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158367.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158367.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;抽象工厂模式(Abstract Factory)：提供一个创建一系列相关或者相互依赖对象的接口，而无需指定它们具体的类。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height="546" alt="" src="http://www.cppblog.com/images/cppblog_com/jokes000/抽象工厂模式结构图.jpg" width="660" border="0" longdesc="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractFactory：抽象工厂接口，它里面应该包含所有的产品创建的抽象方法。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractProductA、AbstractProductB：抽象产品，它们都有可能两种以上不同的实现。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大的好处便是易于交换产品系列，由于具体工厂类，在一个应用中只需要在初始化的时候出现一次，这就使得改变一个应用的具体工厂变得非常容易，它只需要改变具体工厂即可使用不同的产品配置。它让具体的创建实例过程与客户端分离，客户端是通过它们的抽象接口操纵实例，产品的具体类名也被具体的工厂分离实现，不会出现在客户端代码中。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;缺点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若需要新增加一个ProductC，需要增加很多类，以及修改相应很多类。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解决方案：反射+抽象工厂模式。<img src ="http://www.cppblog.com/jokes000/aggbug/158367.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-15 17:21 <a href="http://www.cppblog.com/jokes000/archive/2011/10/15/158367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--观察者模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/14/158306.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Fri, 14 Oct 2011 11:13:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/14/158306.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158306.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/14/158306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158306.html</trackback:ping><description><![CDATA[代码：<br />&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_191247" onclick="this.style.display='none'; Code_Closed_Text_191247.style.display='none'; Code_Open_Image_191247.style.display='inline'; Code_Open_Text_191247.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_191247" style="display: none" onclick="this.style.display='none'; Code_Open_Text_191247.style.display='none'; Code_Closed_Image_191247.style.display='inline'; Code_Closed_Text_191247.style.display='inline';" height="16" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_191247" 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_191247" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;观察者类：<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;它把所有对观察者对象的引用保存在一个聚集里，<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;每个主题都可以有任何数量的观察者。抽象出题<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;提供一个借口，可以增加和删除观察者对象<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Subject<br />{<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Observer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;observers;<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;增加观察者</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Attach(Observer&nbsp;observer)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observers.add(observer);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;移除观察者</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Detach(Observer&nbsp;observer)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observers.remove(observer);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通知</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Notify()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">foreach</span><span style="color: #000000; ">(&nbsp;Observer&nbsp;o&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;observers&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.Update();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;Observer类，抽象观察者<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;为所有的具体观察者定义一个接口，在得到主题的通知时更新自己。<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;实现。更新接口通常包含一个Update()方法。<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Observer<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&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;Update();<br />};<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;ConcreteObserver类：<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;将有关状态存入具体观察者对象；在具体主题的内部状态改变时，<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;给所有登记过的观察者发出通知。具体主题角色通常用一个具体<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;子类实现。<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ConcreteSubject&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Subject<br />{<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;subjectState;<br />&nbsp;&nbsp;&nbsp;&nbsp;<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; ">get-set方法;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">};<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;ConcreteObserver类：<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;实现抽象观察者角色所要求的更新接口，以便使本身的状态与主题<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;的状态相协调。具体观察者角色可以保存一个指向具体主题对象的<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;引用。具体观察者角色通常用一个具体子类实现。<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ConcreteObserver&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Observer<br />{<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;observerState;<br />&nbsp;&nbsp;&nbsp;&nbsp;ConcreteSubject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">subject;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;ConcreteObserver(ConcreteSubject</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;subject,&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">subject&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;subject;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Update()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observerState&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;subject</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">subjectState;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;do&nbsp;something..</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Concretesubject的get、set方法</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">};<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;客户端代码</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ConcreteSubject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ConcreteSubject();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">Attach(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ConcreteObserver(s,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">X</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">Attach(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ConcreteObserver(s,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Y</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setSubject(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ABC</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;s.Notify();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /></span></span></div><br />&nbsp; &nbsp; &nbsp; 观察者模式：又称发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时，会通知所有观察者对象，使他们能够自动更新自己。<br /><br />&nbsp; &nbsp; &nbsp; 观察者模式的动机是什么：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将一个系统分割成一系列相互协作的类有一个很不好的副作用，那就是需要维护相关对象的一致性。我们不希望为了维持一致性而使各类紧密耦合，这样会给维护、扩展和重用都带来不便。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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; 结构图:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/观察者模式结构图.jpg" width="655" height="533" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158306.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-14 19:13 <a href="http://www.cppblog.com/jokes000/archive/2011/10/14/158306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--建造者模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/12/158122.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Wed, 12 Oct 2011 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/12/158122.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158122.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/12/158122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158122.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Builder.txt">/Files/jokes000/Builder.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 建造者模式(Builder)：将一个复杂对象的构建与它的表示分离，使得同样地构建过程可以创建不同的表示。如果我们用了建造者模式，那么用户就只需指定需要建造的类型就可以得到它们，而具体建造的过程和细节就不需要知道了。<br /><br />&nbsp; &nbsp; &nbsp; 使用：用于创建一些复杂的对象，这些对象内部构建间的建造顺序通常是稳定的，但对象内部的构建通常面临着复杂的变化。<br />&nbsp; &nbsp; &nbsp; 建造模式的好处就是使得建造代码与表示代码分离，由于建造者隐藏了该产品是如何组装的，所以若需要改变一个产品的内部表示，只需要再定义一个具体的建造者就可以了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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="596" height="338" alt="" /><br /><br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.cppblog.com/jokes000/aggbug/158122.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-12 11:26 <a href="http://www.cppblog.com/jokes000/archive/2011/10/12/158122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--外观模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/12/158101.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Wed, 12 Oct 2011 00:47:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/12/158101.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158101.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/12/158101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158101.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158101.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Facade.txt">/Files/jokes000/Facade.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 外观模式(Facade)：为子系统中的一组接口提供一个一致的界面，此模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。(基金经理人与股民关系)<br /><br />&nbsp; &nbsp; &nbsp; 使用： 首先，在设计初期阶段，应该有意识的将不同的两个层分离，比如MVC模式，就应该考虑在M、V、C三层的层与层之间建立外观Facade。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;其次，在开发阶段，子系统往往因为不断的重构烟花而变得越来越复杂，增加外观Facade可以提供一个简单的接口，减少他们之间的依赖。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;第三，在维护一个遗留的大型系统时，可能这个系统已经非常难以维护和扩展了，在新需求开发时可以为新系统开发一个外观Facade类，来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口，让新系统与Facade对象交互，Facade与遗留代码交互所有复杂的工作。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/外观模式结构图.jpg" width="593" height="427" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/158101.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-12 08:47 <a href="http://www.cppblog.com/jokes000/archive/2011/10/12/158101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迪米特法则--最少知识原则</title><link>http://www.cppblog.com/jokes000/archive/2011/10/12/158100.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Wed, 12 Oct 2011 00:23:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/12/158100.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158100.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/12/158100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158100.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 迪米特法则(LoD):如果两个类不必彼此直接通信，那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话，可以通过第三者转发这个调用。<br /><br />&nbsp; &nbsp; &nbsp; 前提：在类的结构设计上，每一个类都应当尽量降低成员的访问权限。<br />&nbsp; &nbsp; &nbsp; 根本思想：强调了类之间的松耦合。类之间的耦合越弱，越有利于复用，一个处在弱耦合的类被修改，不会对有关系的类造成波及。<br /><br />&nbsp; &nbsp; &nbsp; 实例：《大话设计模式》P101<img src ="http://www.cppblog.com/jokes000/aggbug/158100.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-12 08:23 <a href="http://www.cppblog.com/jokes000/archive/2011/10/12/158100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--模板方法模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/11/158085.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Tue, 11 Oct 2011 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/11/158085.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/158085.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/11/158085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/158085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/158085.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/TempleteMethod.rar">/Files/jokes000/TempleteMethod.rar</a><br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/TempleteMethod.txt">/Files/jokes000/TempleteMethod.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 模板方法模式(TempleteMethod)：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。<br /><br />&nbsp; &nbsp; &nbsp; 模板方法模式是通过把不变行为搬移到超类去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用平台。当不变的和可变的行为在方法的子类实现中混合在一起的时候，不变的行为就会在子类中重复实现。我们通过模板方法模式把这些行为搬移到单一的地方，这样就帮助子类摆脱重复的不变行为的纠缠。<br /><br />&nbsp; &nbsp; &nbsp; 既然用了继承，并且肯定这个继承有意义，就应该要成为子类的模板，所有重复的代码都应该要上升到父类去，而不是让每个子类去重复。<br />&nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; <span style="color: red; ">什么时候使用？</span>当我们要完成在某一细节层次一致的一个过程或一系列步骤，但其个别步骤在更详细的层次上的实现可能不同时，我们通常考虑用模板方法模式来处理。<br /><br />&nbsp; &nbsp; &nbsp; 模板方法模式(TempleteMethod)结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/模板方法模式结构图.jpg" width="477" height="262" alt="" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.cppblog.com/jokes000/aggbug/158085.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-11 22:17 <a href="http://www.cppblog.com/jokes000/archive/2011/10/11/158085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--原型模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/10/157953.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 10 Oct 2011 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/10/157953.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157953.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/10/157953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157953.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/Prototype.rar">/Files/jokes000/Prototype.rar</a><br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Prototype.txt">/Files/jokes000/Prototype.txt</a><br /><br />&nbsp; &nbsp; &nbsp; 原型模式(prototype)：用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。<br /><br />&nbsp; &nbsp; &nbsp; 原型模式其实就是<span style="color: red; ">从一个对象再创建另外一个可定制的对象，而且不需要知道任何创建的细节。</span><br /><br />&nbsp; &nbsp; &nbsp; 一般在初始化的信息不发生变化的情况下，克隆是最好的办法。这既隐藏了对象创建的细节，又对性能是大大的提高。等于是不用重新初始化对象，而是动态地获得对象运行时的状态。<br /><br />&nbsp; &nbsp; &nbsp; 结构图：<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/原型模式结构图.jpg" width="638" height="489" alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.cppblog.com/jokes000/aggbug/157953.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-10 12:48 <a href="http://www.cppblog.com/jokes000/archive/2011/10/10/157953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--工厂方法模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/10/157951.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 10 Oct 2011 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/10/157951.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157951.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/10/157951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157951.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 实例：<a href="/Files/jokes000/Calculator.rar">/Files/jokes000/Calculator.rar</a><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工厂方法模式(Factory Method)，定义一个用于创建对象的接口，让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。<br /><br />&nbsp; &nbsp; &nbsp; 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断，根据客户端的选择条件动态实例化相关的类，对于客户端来说，去除了与具体的产品的依赖。<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="533" height="513" alt="" /><br /><br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<br /><img src ="http://www.cppblog.com/jokes000/aggbug/157951.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-10 12:28 <a href="http://www.cppblog.com/jokes000/archive/2011/10/10/157951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--代理模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/10/157944.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 10 Oct 2011 03:14:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/10/157944.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157944.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/10/157944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157944.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157944.html</trackback:ping><description><![CDATA[代码：<br />&nbsp; &nbsp; &nbsp; 应用：<a href="/Files/jokes000/Proxy.rar">/Files/jokes000/Proxy.rar</a><br />&nbsp; &nbsp; &nbsp; 示例：<a href="/Files/jokes000/Proxy.txt">/Files/jokes000/Proxy.txt</a><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代理模式(Proxy)，为其他对象提供一种代理以控制对这个对象的访问。<br /><br />&nbsp; &nbsp; &nbsp; 应用场合：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A:远程代理，也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。例：WebService在.NET中应用。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B:虚拟代理，根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(这样就可以达到性能最优化，比如说你打开一个很大的HTML网页时，里面可能有很多的文字和图片，但你还是可以很快打开它，此时你看到的是所有的文字，但图片确实一张一张的下载后才能看到。那些未打开的图片框，就是通过虚拟代理来代替了真实的图片，此时代理存储了真实图片的路径和尺寸。)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C:安全代理，用来控制真实对象访问时的权限。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; D:智能指引，是指当调用真实的对象时，代理处理另外一些事。(如计算真实对象的引用次数。)<br /><br />&nbsp; &nbsp; &nbsp; 代理模式结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/代理模式结构图.jpg" width="939" height="527" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/157944.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-10 11:14 <a href="http://www.cppblog.com/jokes000/archive/2011/10/10/157944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--装饰模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/10/157938.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Mon, 10 Oct 2011 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/10/157938.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157938.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/10/157938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157938.html</trackback:ping><description><![CDATA[代码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例：<a href="/Files/jokes000/Decoration-装饰模式.rar">/Files/jokes000/Decoration-装饰模式.rar</a>&nbsp;<br />&nbsp; &nbsp; &nbsp; 基本：<a href="/Files/jokes000/Decoration.txt">/Files/jokes000/Decoration.txt</a><br /> &nbsp; &nbsp; <br />装饰模式（Decorator），动态给一个对象添加一些额外的职责，就增加功能来说，装饰模式比生成子类更加灵活。<span style="color: red; ">（把所需功能按正确顺序串联起来进行控制）</span><br /><br />&nbsp; &nbsp; &nbsp; 装饰模式结构图：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component是定义一个对象接口，可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象，也可以给这个对象添加一些职责。Decorator，装饰抽象类，继承了Component，从外类来扩展Component类的功能，但对于Component来说，是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象，起到给Component添加职责的功能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/装饰模式结构图.jpg" width="714" height="342" alt="" /><br /><br />&nbsp; &nbsp; &nbsp; 装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就喝如何使用这个对象分开了，每个装饰对象只关心自己的功能，不需要关心如何被添加到对象链当中。<img src ="http://www.cppblog.com/jokes000/aggbug/157938.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-10 10:42 <a href="http://www.cppblog.com/jokes000/archive/2011/10/10/157938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开放-封闭原则</title><link>http://www.cppblog.com/jokes000/archive/2011/10/09/157897.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 09 Oct 2011 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/09/157897.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157897.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/09/157897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157897.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157897.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 开放封闭原则，是说软件试题（类、模块、函数等等）应该可以扩展，但是不可修改。<br /><br />&nbsp; &nbsp; &nbsp; 两个特征： 1.对于扩展是开放的(Open for extension)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.对于更改是封闭的(Closed for modification)<br /><br />&nbsp; &nbsp; &nbsp; 开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处，也就是<span style="color: red; ">可维护、可扩展、可复用、灵活性好</span>。开发人员应该仅对程序中呈现出频繁变化的那些部分作出抽象，然而，对于应用程序中的每个部分都可以地进行抽象同样不是一个好主意。<span style="color: red; ">拒绝不成熟的抽象和抽象本身一样重要。</span><img src ="http://www.cppblog.com/jokes000/aggbug/157897.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-09 21:39 <a href="http://www.cppblog.com/jokes000/archive/2011/10/09/157897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单一职责原则</title><link>http://www.cppblog.com/jokes000/archive/2011/10/09/157895.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 09 Oct 2011 13:34:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/09/157895.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157895.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/09/157895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157895.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 如果一个类承担的职责过多，就等于把这些职责耦合在一起，一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会导致脆弱的设计，当变化发生时，设计会遭受到意想不到的破坏。<br /><br />&nbsp; &nbsp; &nbsp; 软件设计真正要做的许多内容，就是发现职责并把那些职责相互分离。如果你能够想到多余一个的动机去改变一个类，那么这个类就具有多余一个的职责。<img src ="http://www.cppblog.com/jokes000/aggbug/157895.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-09 21:34 <a href="http://www.cppblog.com/jokes000/archive/2011/10/09/157895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式--策略模式</title><link>http://www.cppblog.com/jokes000/archive/2011/10/09/157892.html</link><dc:creator>Voices.</dc:creator><author>Voices.</author><pubDate>Sun, 09 Oct 2011 12:55:00 GMT</pubDate><guid>http://www.cppblog.com/jokes000/archive/2011/10/09/157892.html</guid><wfw:comment>http://www.cppblog.com/jokes000/comments/157892.html</wfw:comment><comments>http://www.cppblog.com/jokes000/archive/2011/10/09/157892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jokes000/comments/commentRss/157892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jokes000/services/trackbacks/157892.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 策略模式(Strategy)：定义了算法家族，分别封装起来，让它们之间可以互相替换，从概念上看，这些算法完成的都是相同的工作，只是实现不同，它可以以相同的方式调用所有算法，减少了各种算法类与使用算法类之间的耦合。<span style="color: red; ">此模式让算法的变化不会影响到使用算法的客户。<br /><br /></span><span>&nbsp; &nbsp; &nbsp; 优点：&#9332; Stratey类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#9333; 简化了单元测试，因为每个算法都有自己的类，可以通过自己的接口单独测试。<br /><br />&nbsp; &nbsp; &nbsp; 策略模式就是用来封装算法的，但在实践中，我们发现可以用它来封装几乎任何类型的规则，只要在分析过程中听到</span><span></span><span style="color: #ff0000; ">需要在不同时间应用不同的业务规则</span>，就可以考虑使用策略模式处理这种变化的可能性。<br /><br />&nbsp; &nbsp; &nbsp; 在基本的策略模式中，选择所用具体实现的职责由客户端对象承担，并转给策略模式的Context对象。<br /><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;策略模式结构图：</div>&nbsp; &nbsp; &nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/jokes000/策略模式结构图-final.JPG" width="857" height="477" alt="" /><img src ="http://www.cppblog.com/jokes000/aggbug/157892.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-09 20:55 <a href="http://www.cppblog.com/jokes000/archive/2011/10/09/157892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>