<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CSSrainbow.cn &#187; GoF</title>
	<atom:link href="http://cssrainbow.cn/category/tutorials/gof/feed" rel="self" type="application/rss+xml" />
	<link>http://cssrainbow.cn</link>
	<description>Sharing what I know and learn about (X)HTML,CSS,JavaScript,MooTools,Dojo,jQuery,PHP,ASP,Java,Python and ∞.</description>
	<lastBuildDate>Sun, 05 Sep 2010 15:08:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>为什么学习设计模式 转 IT168</title>
		<link>http://cssrainbow.cn/tutorials/gof/286.html</link>
		<comments>http://cssrainbow.cn/tutorials/gof/286.html#comments</comments>
		<pubDate>Tue, 26 May 2009 05:55:37 +0000</pubDate>
		<dc:creator>Rainbow</dc:creator>
				<category><![CDATA[GoF]]></category>
		<category><![CDATA[JAVA设计模式]]></category>
		<category><![CDATA[读书]]></category>

		<guid isPermaLink="false">http://cssrainbow.cn/?p=286</guid>
		<description><![CDATA[现在你对“什么是设计模式”已经有了感性认识，也许有人会问：“为什么要学习设计模式呢？”原因有很多，一些非常明显，而另一些则不那么明显。

学习模式最常见的理由是因为我们可以借其：

● 复用解决方案——通过复用已经公认的设计，我能够在解决问题时取得先发优势，而且避免重蹈前人覆辙。我可以从学习他人的经验中获益，用不着为那些总是会重复出现的问题再次设计解决方案了。

● 确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。

模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角，这将使我们从“过早处理细节”的桎梏中解放出来。

等你读完本书的时候，我希望你将同意这是学习设计模式的最重要的原因之一。它将改变你的思维定式，使你成为更加高效的分析人员。]]></description>
			<content:encoded><![CDATA[<p>现在你对“什么是设计模式”已经有了感性认识，也许有人会问：“为什么要学习设计模式呢？”原因有很多，一些非常明显，而另一些则不那么明显。</p>
<p>学习模式最常见的理由是因为我们可以借其：</p>
<p>  ●   复用解决方案——通过复用已经公认的设计，我能够在解决问题时取得先发优势，而且避免重蹈前人覆辙。我可以从学习他人的经验中获益，用不着为那些总是会重复出现的问题再次设计解决方案了。</p>
<p>  ●   确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。</p>
<p>模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角，这将使我们从“过早处理细节”的桎梏中解放出来。</p>
<p><span id="more-286"></span></p>
<p>等你读完本书的时候，我希望你将同意这是学习设计模式的最重要的原因之一。它将改变你的思维定式，使你成为更加高效的分析人员。</p>
<p>为了说明这一优点，我想引述一段两个木匠之间关于“如何为橱柜制作抽屉”的谈话。</p>
<p>想像一下，有两个木匠在讨论怎样为橱柜制作抽屉。</p>
<p>木匠甲：你认为我们应该怎样制作这些抽屉？</p>
<p>木匠乙：这个嘛，我想榫子应该这样做：在木料上直着锯下去，然后向回转45°再锯，接着再直着锯，然后换一个方向45°往回锯，接着再直着锯下去，然后……</p>
<p>现在，你要做的就是搞清楚他们说的是什么意思！</p>
<p>这段描述是不是让人不知所云？木匠乙到底给出了什么建议？细节往往就是如此！让我们试着将他的叙述画出来。</p>
<p>这听上去像不像似曾相识的代码评审？在评审中有一位程序员这样描述自己的代码： </p>
<p>然后，我在这里用一个WHILE 循环来……接着是一系列IF语句执行……这里我用一条SWITCH语句处理……</p>
<p>你获得的是对代码细节的描述，而对“程序到底要做什么”、“为什么这么做”，你却毫无头绪!</p>
<p>当然，正经的职业木匠可不会这样说话。真实的情形应该是这样：</p>
<p>木匠甲：我们应该用鸠尾榫还是斜榫？</p>
<p>看到这里的本质区别没有？木匠们现在讨论的是一个问题的解决方案上的本质差异，他们的讨论层次更高、也更抽象了，从而避免了陷入具体解决方案的细节泥沼中。</p>
<p>当木匠谈到“斜榫”时，他的脑子里已经对这个解决方案浮现出如下特征：</p>
<p>  ●   它是一个更简单的解决方案——斜榫更容易制作。只需将制作榫的木料锯出45°斜面，然后用钉子或者木胶接合起来即可（如图5-2所示）。</p>
<p>  ● 它更轻型——斜榫比鸠尾榫强度低。在重压下，将无法保持榫接。</p>
<p>  ●   它不太引人注目——斜榫的一个锯面，与鸠尾榫的多个锯面相比，更不显眼。</p>
<p align="center"><img alt="" src="http://image.it168.com/cms/2007-5-25/Image/2007525101554.jpg" /></p>
<p align="center">图5-2  斜榫</p>
<p>当木匠谈到“鸠尾榫”时，他的脑子里浮现出另一些特征。这些特征对外行来说可能并不明显，但任何一位木匠都会明白如故：</p>
<p>  ●   它是一个更复杂的解决方案——制作鸠尾榫涉及的问题更多。因此，它的成本也更高。</p>
<p>  ●   它不容易受温度和湿度影响——当温度和湿度变化时，木材会膨胀或收缩，但是，鸠尾榫仍然能够保持坚固。</p>
<p>  ● 它与紧固系统无关——事实上，鸠尾榫甚至不需要依赖胶水。</p>
<p>  ● 它看上去更赏心悦目——如果制作精良，会很美观。</p>
<p>也就是说，鸠尾榫是一个坚固、可靠、美观的榫，但制作复杂（所以成本也比较高）。</p>
<p>所以，当木匠甲这样问的时候：</p>
<p>我们应该用鸠尾榫还是斜榫？</p>
<p>他真正要问的问题是：</p>
<p>我们是应该用一个制作昂贵但美观耐用的榫，还是应该只用一个制作快速而且不美观的榫，能坚持到检查结束就行？</p>
<p>我们应该说，木匠们的讨论其实是在两个层次上进行的：他们话语表面上的层次，和谈话真正的内容，层次更高，外行听不出来，而其中含义却非常丰富。这种更高的层次就是“木匠模式”的层次，它反映了木匠眼中的真正的设计问题。</p>
<p>在第1种情形中，木匠乙讨论的是榫的实现细节，反而使真正的问题模糊不清。在第2种情形中，木匠甲要根据榫的成本和接合性质来决定使用哪种榫。</p>
<p>谁更有效率呢？你更愿意与谁一起工作？</p>
<p>当我说“模式有助于提高思考层次”时，其中就蕴涵着这一层含义。从本书后面的内容中你将了解到，如果能够这样提高自己的思考层次，新的设计方法也将浮现出来。这正是模式真正的威力所在。</p>
<h3  class="related_post_title">相关日志 »</h3><ul class="related_post"><li>2009/08/31 -- <a href="http://cssrainbow.cn/articles/resources/671.html" title="Opera的Web标准课程（推荐）">Opera的Web标准课程（推荐）</a> (1)</li><li>2009/08/13 -- <a href="http://cssrainbow.cn/articles/resources/625.html" title="MooTools国外的教程和资源大集合">MooTools国外的教程和资源大集合</a> (0)</li><li>2009/08/12 -- <a href="http://cssrainbow.cn/articles/resources/618.html" title="数据之美（三）">数据之美（三）</a> (0)</li><li>2009/08/08 -- <a href="http://cssrainbow.cn/articles/resources/602.html" title="浏览器 跨域 安全 (收藏)">浏览器 跨域 安全 (收藏)</a> (0)</li><li>2009/08/07 -- <a href="http://cssrainbow.cn/tutorials/mootools/599.html" title="选择mootools的5个原因(转)">选择mootools的5个原因(转)</a> (0)</li><li>2009/08/07 -- <a href="http://cssrainbow.cn/articles/resources/595.html" title="MooTools vs Prototype 核心代码分析-为什么选择MooTools ">MooTools vs Prototype 核心代码分析-为什么选择MooTools </a> (2)</li><li>2009/08/01 -- <a href="http://cssrainbow.cn/articles/general/573.html" title="菊花香">菊花香</a> (0)</li><li>2009/07/22 -- <a href="http://cssrainbow.cn/articles/resources/523.html" title="如何做好一份前端工程师的简历 (收藏)">如何做好一份前端工程师的简历 (收藏)</a> (0)</li><li>2009/07/10 -- <a href="http://cssrainbow.cn/articles/general/402.html" title="低调做人 高调做事">低调做人 高调做事</a> (0)</li><li>2009/07/10 -- <a href="http://cssrainbow.cn/articles/general/398.html" title="神奇的成功步骤">神奇的成功步骤</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cssrainbow.cn/tutorials/gof/286.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GoF设计模式趣解</title>
		<link>http://cssrainbow.cn/tutorials/gof/56.html</link>
		<comments>http://cssrainbow.cn/tutorials/gof/56.html#comments</comments>
		<pubDate>Fri, 17 Apr 2009 23:00:04 +0000</pubDate>
		<dc:creator>Rainbow</dc:creator>
				<category><![CDATA[GoF]]></category>

		<guid isPermaLink="false">http://cssrainbow.cn/CssRainBow/?p=56</guid>
		<description><![CDATA[GoF设计模式趣解]]></description>
			<content:encoded><![CDATA[<p>1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory </p>
<p>        工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 </p>
<p>        2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。（这一定比美军在伊拉克用的翻译机好卖） </p>
<p><span id="more-56"></span></p>
<p>        建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 </p>
<p>        3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 </p>
<p>        工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 </p>
<p>        4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） </p>
<p>        原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 </p>
<p>        5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) </p>
<p>        单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 </p>
<p>        结构型模式 </p>
<p>        6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) </p>
<p>        适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 </p>
<p>        7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了 </p>
<p>        桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 </p>
<p>        8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有？ </p>
<p>        合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 </p>
<p>        9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ </p>
<p>        装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 </p>
<p>        10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 </p>
<p>        门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 </p>
<p>        11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 </p>
<p>        享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 </p>
<p>        12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。 </p>
<p>        代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。 </p>
<p>        行为模式 </p>
<p>        13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑! </p>
<p>        责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 </p>
<p>        起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 </p>
<h3  class="related_post_title">相关日志 »</h3><ul class="related_post"><li>2009/05/26 -- <a href="http://cssrainbow.cn/tutorials/gof/286.html" title="为什么学习设计模式 转 IT168">为什么学习设计模式 转 IT168</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cssrainbow.cn/tutorials/gof/56.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
