﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天使的白骨-随笔分类-设计模式</title><link>http://www.cppblog.com/TianShiDeBaiGu/category/20900.html</link><description>给我一个EMACS，我不需要操作系统</description><language>zh-cn</language><lastBuildDate>Wed, 01 Apr 2015 02:39:07 GMT</lastBuildDate><pubDate>Wed, 01 Apr 2015 02:39:07 GMT</pubDate><ttl>60</ttl><item><title>谈谈MVVM和MVC，使用swift集成RFP框架（ReactiveCocoa）</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/08/05/207913.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Tue, 05 Aug 2014 03:29:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/08/05/207913.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/207913.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/08/05/207913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/207913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/207913.html</trackback:ping><description><![CDATA[非常激动的和各位分享RFP的经验。目前国内使用swift开发实际项目的文章几乎还找不到，不用说ReactiveCocoa了。我打算把两个一起简单说一下。<br />MVC和MVVM的差异，我觉得对比实在是很细，重点是，MVVM的分割性更好，正交性强，而MVC在逻辑和试图代码方面经常混在一起,不能很好的模块化,以至于在多人开发的模式下,时不时出现逻辑混乱的情况。<br />另一个核心问题是，常规的编程思路在对象的依赖关系的维护方面基本无能为力。<br />我不想在一篇文章中扯一大把概念，MVVM的介绍和优点你可以自己去搜索。<br /><div><a href="http://www.cnblogs.com/lori/p/3501764.html" title="这里是比较简介的介绍"><span style="color: #0000ff;">这里是比较简洁的介绍</span></a></div><br />原来兴致冲冲的百度了一下swift RFP／RAC／MVVM，没实质性内容，干脆自己写一篇。<br />就谈谈在swift中使用MVVM吧，你可以去我的<a href="https://github.com/he-mark-qinglong/jiading_swift" title="github仓库"><span style="color: #0000ff;">github仓库</span></a>下载这里的完整代码.<br />RAC在object－c中的使用在github上有实例的。各位可以移步去看一下。<br /><br />环境前提是你要有xcode6，pod管理器。这些工具你应该自己去找一下，当然你就用我的这个项目也行。<br />说一下集成步骤：<br />1.使用pod添加ReactiveCocoa到工程中，细节略。<br />2.打开编译xcworkspace，新建一个swift代码文件，在建立过程中，xcode会问你是不是要建立与object－c的混编中间头文件，选择是，并在这个头文件中加入RAC的头文件<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#import&nbsp;&lt;ReactiveCocoa/RACEXTScope.h&gt;<br />#import&nbsp;&lt;ReactiveCocoa/ReactiveCocoa.h&gt;</div>以及你要使用的object－c的其他库的头文件<br />3.可以使用了，新建一个swift源文件，建立一个nib文件和它关联，然后设置一个button，代码类似这样：<br /><div style="padding: 4px 5px 4px 4px; font-size: 13px; border: 1px solid #cccccc; width: 1229.890625px; word-break: break-all; background-color: #eeeeee;"><br />@IOBullet button:UIButton&nbsp;=&nbsp;UIButton.buttonWithType(UIButtonType.Custom)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.rac_signalForControlEvents(UIControlEvents.TouchUpInside)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeNext{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;<span style="color: #0000ff;">in</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog("按钮点击事件")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008000;">//</span><span style="color: #008000;">加入到UI层去</span></div><div><font color="#008000">测试可以使用RAC了。</font>点击这个按钮，打印内容就出来了</div>4.在swift中使用类似object－c中的RAC(button, hidden) = RACObserve(button2, hidden)是会出错的。需要自己实现，object－c中的RAC（）这个宏很讨厌，想搞懂的可以网上查，我也记不清了。好了，我们来解决这个问题。<br />新建一个swift源码，最好叫ReactiveCocoa.swift，加入下面的代码：<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"><!--<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; "><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;ReactiveCocoa.swift<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;XianRenZhang<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Created&nbsp;by&nbsp;kriswangw&nbsp;on&nbsp;14/11/14.<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2014年&nbsp;kriswangw.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008000; ">//<br /></span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;RAC&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;target&nbsp;:&nbsp;NSObject!<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;keyPath&nbsp;:&nbsp;String!<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nilValue&nbsp;:&nbsp;AnyObject!<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;init(_&nbsp;target:&nbsp;NSObject!,&nbsp;_&nbsp;keyPath:&nbsp;String,&nbsp;nilValue:&nbsp;AnyObject?&nbsp;=&nbsp;nil)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.target&nbsp;=&nbsp;target<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.keyPath&nbsp;=&nbsp;keyPath<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.nilValue&nbsp;=&nbsp;nilValue<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;assignSignal(signal&nbsp;:&nbsp;RACSignal)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal.setKeyPath(self.keyPath,&nbsp;onObject:&nbsp;self.target,&nbsp;nilValue:&nbsp;self.nilValue)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;func&nbsp;RACObserve(target:&nbsp;NSObject!,&nbsp;keyPath:&nbsp;NSString)&nbsp;-&gt;&nbsp;RACSignal&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;target.rac_valuesForKeyPath(keyPath,&nbsp;observer:&nbsp;target)<br />}<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;func&nbsp;&lt;=&nbsp;(rac:RAC,&nbsp;signal:RACSignal){<br />&nbsp;&nbsp;&nbsp;&nbsp;rac.assignSignal(signal)<br />}<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;func&nbsp;&gt;=(&nbsp;signal:RACSignal,&nbsp;rac:RAC){<br />&nbsp;&nbsp;&nbsp;&nbsp;rac.assignSignal(signal)<br />}</div>然后我只要改变tableView的hidden属性，scrollView的属性就会跟着改变了，不用再去维护两个变量。<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"><!--<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; ">两个按钮的点击切换不同的内容。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.changguan_btn.rac_signalForControlEvents(UIControlEvents.TouchUpInside)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeNext&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;<span style="color: #0000FF; ">in</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tableView.hidden&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.zhanpin_btn.rac_signalForControlEvents(UIControlEvents.TouchUpInside)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeNext{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;<span style="color: #0000FF; ">in</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tableView.hidden&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />RAC的函数思想使得代码服用行更强，可以让我们把按钮的控制写成逻辑算法，而不是一个一个的重复的回调事件函数，或者含有多个链接nib文件的函数（不好维护）。<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<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; ">TODO，修改为对应的UIViewController.也有可能是同一个ViewController，但是参数不同</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ciqi_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;yuqi_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;huihua_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;wenhuajiading_vc&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;zuke_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;shufa_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;qingtong_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;keju_vc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;UIViewController()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;btns2Actions:&nbsp;NSDictionary&nbsp;=&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"瓷器":[self.qiciBtn,&nbsp;ciqi_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"玉器":[self.yuqiBtn,&nbsp;yuqi_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"绘画":[self.huihuaBtn,&nbsp;huihua_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"文化嘉定":[self.wenhuajiadingBtn,&nbsp;wenhuajiading_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"竹刻":[self.zukeBtn,&nbsp;zuke_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"书法":[self.shufaBtn,&nbsp;shufa_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"青铜":[self.qingtongBtn,&nbsp;qingtong_vc],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"科举":[self.kejuBtn,&nbsp;keju_vc]]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">定制每个button事件跳转的视图控制器。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(key&nbsp;:&nbsp;AnyObject,&nbsp;value&nbsp;:&nbsp;AnyObject&nbsp;)&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;btns2Actions&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;array&nbsp;=&nbsp;value&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;NSArray;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;btn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;array[0]&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;UIButton;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;vc:UIViewController&nbsp;=&nbsp;array[1]&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;UIViewController;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btn.rac_signalForControlEvents(UIControlEvents.TouchUpInside)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeNext&nbsp;{&nbsp;_&nbsp;<span style="color: #0000FF; ">in</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.navigationController.pushViewController(vc,&nbsp;animated:<span style="color: #0000FF; ">false</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div>这段代码展示了使用抽象来统一所有事件响应的功能。每一个按钮对应的视图控制器都被绑定到一起了，如果新加入别的功能，代码仍然非常容易维护。所有功能相同的都放在了一起，约束性更强。<br /><br />其他的RAC功能基本上默认就能使用，combineLatest也是可以直接使用的。记住swift中的所有方法调用都是"."下标符号，包括静态方法，init和隐式析够除外。<br /><br />swift中没有#pragma宏，所以，它提供了这个注释风格（内置的）<br /><code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; color: #444444; line-height: 17.2800006866455px; background: #eeeeee;">// MARK:</code><span style="color: #444444; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 13px; line-height: 17.2800006866455px; background-color: #fafafa;">,&nbsp;</span><code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; color: #444444; line-height: 17.2800006866455px; background: #eeeeee;">// TODO:</code><span style="color: #444444; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 13px; line-height: 17.2800006866455px; background-color: #fafafa;">&nbsp;and&nbsp;</span><code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; color: #444444; line-height: 17.2800006866455px; background: #eeeeee;">// FIXME<br /></code>可以达到和#pragma一样的效果<br />最后，swift和RFP都是非常好的东西，希望各位尽快用上，不然你要掉队了<img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/207913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-08-05 11:29 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/08/05/207913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装饰模式，动态地往一个类中添加新的行为</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205446.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Fri, 17 Jan 2014 09:07:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205446.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205446.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205446.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205446.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205446.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-01-17 17:07 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原型模式，简化多次创建相同的内容</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205445.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Fri, 17 Jan 2014 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205445.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205445.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205445.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205445.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-01-17 16:53 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/17/205445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>外观模式 与 适配器模式，</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205203.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Mon, 06 Jan 2014 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205203.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205203.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205203.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205203.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205203.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-01-06 16:40 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>责任链表模式，链式的对象事件（消息、句柄）处理</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205202.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Mon, 06 Jan 2014 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205202.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205202.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205202.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205202.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-01-06 16:17 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/06/205202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>委托模式，被调用者的执行动作交给另一个对象实际操作，使用聚合代替继承</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205144.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Fri, 03 Jan 2014 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205144.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205144.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205144.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205144.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205144.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-01-03 17:05 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>组合模式，为统一和区分“部分-整体关系”使用树状结构来管理对象节点。</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205142.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Fri, 03 Jan 2014 08:29:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205142.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205142.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205142.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205142.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205142.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2014-01-03 16:29 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2014/01/03/205142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迭代器模式，遍历元素聚合对象的所有节点</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/31/205081.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Tue, 31 Dec 2013 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/31/205081.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205081.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/31/205081.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205081.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/31/205081.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-31 15:27 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/31/205081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>观察者模式，让一个对象观察另一个对象的状态</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/28/205042.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Sat, 28 Dec 2013 06:31:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/28/205042.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205042.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/28/205042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205042.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205042.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 观察者<br><br>（Observer）将自己注册到被观察对象（Subject）中，被观察对象将观察者存放在一个容器（Container）里。<br>被观察<br><br>被观察对象发生了某种变化（如图中的SomeChange），从容器中得到所有注册过的观察者，将变化通知观察者。<br>撤销观察<br><br>观察者告诉被观察者要撤销观察，被观察者从容器中将观察者去除。&nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/28/205042.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-28 14:31 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/28/205042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>策略模式，应付元素（复数）的算法等策略的变化</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/27/205036.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Fri, 27 Dec 2013 11:08:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/27/205036.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205036.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/27/205036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205036.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205036.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/27/205036.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-27 19:08 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/27/205036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>桥接模式，将抽象化(Abstraction)与实现化(Implementation)脱耦，使得二者可以独立地变化"</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/25/205007.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Wed, 25 Dec 2013 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/25/205007.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/205007.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/25/205007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/205007.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/205007.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/25/205007.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/205007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-25 14:58 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/25/205007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象工厂模式, 使一个类的实例化延迟到其子类。</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204992.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Tue, 24 Dec 2013 08:04:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204992.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/204992.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/204992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/204992.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204992.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/204992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-24 16:04 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工厂类模式,根据字符串运行时刻动态产生类对象</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204991.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Tue, 24 Dec 2013 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204991.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/204991.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/204991.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/204991.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204991.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/204991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-24 16:01 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/24/204991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单件模式，如何灵活应付单例的生命周期。</title><link>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/23/204958.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Mon, 23 Dec 2013 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/23/204958.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/204958.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/23/204958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/204958.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/204958.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/23/204958.html'>阅读全文</a><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/204958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2013-12-23 13:09 <a href="http://www.cppblog.com/TianShiDeBaiGu/archive/2013/12/23/204958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>