<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>千里之行——www.footya.com</title>
		<link>http://www.footya.com//</link>
		<description>人的头脑太复杂,时间过得久,有时候连自己也被自己骗了,记下来才是最真实的......</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Sun, 20 May 2012 12:22:52 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=126</guid>
			<title>《Head First 设计模式》读书笔记8——设计模式之模版方法模式</title>
			<author>footya</author>
			<description><![CDATA[<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong>定义：</strong></span></div>
<p><span style="font: 14px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">模版方法模式定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。模版方法TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。</span></p>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong>uml<br />
</strong><a href="http://www.footya.com//attachment.php?id=81" target="_blank"><img src="http://www.footya.com//attachments//date_201205/4b2bc309ffc6e99ba8431247977c7d24.png" border="0" alt="大小: 9 K&#13;尺寸: 400 x 224&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="400" height="224" /></a><br />
</span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong>角色组成：</strong></span>
<div><span style="font-size: 14px;">抽象摸板角色（AbstractClass）:</span></div>
<div><span style="font-size: 14px;">　　1. 定义了一个或多个抽象操作,以便让子类实现.</span></div>
<div><span style="font-size: 14px;">　　2. 定义并实现了一个摸板方法.</span></div>
<div><span style="font-size: 14px;">具体摸板角色(ConcreteClass):</span></div>
<div><span style="font-size: 14px;">　　1. 实现父类所定义的一个或多个抽象方法.</span></div>
<div><span style="font-size: 14px;">　　2. 每一个抽象摸板角色都可以有任意多个具体摸板角色与之对应.</span></div>
<div><span style="font-size: 14px;">　　3. 每一个具体摸板角色都可以给出这些抽象方法的不同实现</span></div>
</div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong><br />
适用场景：<br />
</strong></span><span style="font-size: 14px;">1、一次性实现一个算法的不变的部分，并将可变的行为留给子类来实现。</span>
<div><span style="font-size: 14px;">2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处，并且将不同之处分离为新的操作。最后，用一个调用这些新的操作的模板方法来替换这些不同的代码。</span></div>
<div><span style="font-size: 14px;">3、控制子类扩展。模板方法只在特定点调用&ldquo;hook&rdquo;操作，这样就只允许在这些点进行扩展。<br />
</span></div>
</div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong>示例代码：</strong><br />
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//抽象摸板角色（AbstractClass）</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;AbstractClass(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.jsready&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>AbstractClass.prototype.templateMethod&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primitiveOperation1();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primitiveOperation2();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.jsready){</span><span class="comment">//控制子类扩展</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primitiveOperation3();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.primitiveOperation4();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>AbstractClass.prototype.primitiveOperation1&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;子类实现这个方法&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>AbstractClass.prototype.primitiveOperation2&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;子类实现这个方法&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>AbstractClass.prototype.primitiveOperation3&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;点火&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>AbstractClass.prototype.primitiveOperation4&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;发射&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体摸板角色(ConcreteClass)</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteClass(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;AbstractClass.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteClass.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;AbstractClass();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteClass.prototype.constructor&nbsp;=&nbsp;ConcreteClass;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//通过改变钩子来决定模版的执行步骤</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteClass.prototype.setReadyState&nbsp;=&nbsp;<span class="keyword">function</span><span>(state){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.jsready&nbsp;=&nbsp;state;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;准备就绪&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteClass.prototype.primitiveOperation1&nbsp;=&nbsp;<span class="keyword">function</span><span>(request){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;打开闸门&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteClass.prototype.primitiveOperation2&nbsp;=&nbsp;<span class="keyword">function</span><span>(request){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;挪开支架&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;rocket&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteClass();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rocket.templateMethod();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rocket.setReadyState(<span class="keyword">true</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rocket.templateMethod();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
</span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong>输出：</strong></span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
<div><span style="font-size: 14px;">打开闸门</span></div>
<div><span style="font-size: 14px;">挪开支架</span></div>
<div><span style="font-size: 14px;">准备就绪</span></div>
<div><span style="font-size: 14px;">打开闸门</span></div>
<div><span style="font-size: 14px;">挪开支架</span></div>
<div><span style="font-size: 14px;">点火</span></div>
<div><span style="font-size: 14px;">发射</span></div>
</div>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=126</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2012-05-15 22:32</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=125</guid>
			<title>《Head First 设计模式》读书笔记7——设计模式之装饰者模式</title>
			<author>footya</author>
			<description><![CDATA[<p style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px; font-weight: bold;">装饰者模式（</span><strong style="font-size: 14px;">Decorator</strong><span style="font-size: 14px;"><strong>）定义：<br />
</strong></span><span style="font-size: 14px;">动态将职责附加到对象上。若要扩展功能，装饰者提供了比继承更具弹性的代替方案<br />
<strong>uml图示：<br />
</strong></span><span style="font-size: 14px;"><a href="http://www.footya.com//attachment.php?id=80" target="_blank"><img src="http://www.footya.com//attachments//date_201205/03df0c5382f68244f9a9e573446f4109.png" border="0" alt="大小: 16.61 K&#13;尺寸: 691 x 287&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="691" height="287" /></a><br />
</span><span style="font-size: 14px; font-weight: bold;">装饰者模式的角色组成：</span><br />
<span style="font-size: 14px; font-weight: bold;">被装饰对象基类Component:</span><span style="font-size: 14px;">&nbsp;定义对象的接口，可以给这些对象动态增加职责；<br />
</span><strong><span style="font-size: 14px;">具体被装饰对象</span>&nbsp;<span style="font-size: 14px;">ConcreteComponent:&nbsp;</span></strong><span style="font-size: 14px;">定义具体的对象，Decorator可以给它增加额外的职责；<br />
</span><strong><span style="font-size: 14px;">装饰者抽象类</span>&nbsp;</strong><span style="font-size: 14px;"><strong>​Decorator :</strong>&nbsp;维护一个指向Component实例的引用，并且定义了与Component一致的接口；&nbsp;<br />
</span><span style="font-size: 14px;"><strong>具体装饰者</strong></span><strong style="font-size: 14px;">ConcreteDecorator:&nbsp;</strong><span style="font-size: 14px;">具体的装饰对象，给内部持有的具体被装饰对象增加具体的职责；</span><br />
<span style="font-size: 14px;"><strong>实用场合：</strong></span><br />
<span style="font-size: 14px;">1、在不影响其他对象的情况下，以动态、透明的方式给单个对象添加职责。&nbsp;<br />
</span><span style="font-size: 14px;">2、处理那些可以撤消的职责。&nbsp;<br />
</span><span style="font-size: 14px;">3、当不能采用生成子类的方法进行扩充时。一种情况是，可能有大量独立的扩展，为支持每一种组合将产生大量的子类，使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏，或类定义不能用于生成子类。</span></p>
<p style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">Decorator是装饰者模式里非常特殊的一个类，它既继承于Component【IS A关系】,又维护一个指向Component实例的引用【HAS A关系】，Decorator跟Component之间，既有动态组合关系又有静态继承关系，WHY? 这里为什么要这么来设计？Decorator【HAS A】Component的目的是让ConcreteDecorator可以在运行时动态给ConcreteComponent增加职责，这一点相对来说还比较好理解；那么Decorator继承于Component的目的是什么？在这里，继承的目的只有一个，那就是可以统一装饰者和被装饰者的接口，换个角度来说，不管是ConcretComponent还是ConcreteDecorator，它们都是 Component，用户代码可以把它们统一看作Component来处理，这样带来的更深一层的好处就是，装饰者对象对被装饰者对象的功能职责扩展对用户代码来说是完全透明的，因为用户代码引用的都是Component，所以就不会因为被装饰者对象在被装饰后，引用它的用户代码发生错误，实际上不会有任何影响，因为装饰前后，用户代码引用的都是Component类型的对象，完美的设计！装饰者模式通过继承实现统一了装饰者和被装饰者的接口，通过组合获得了在运行时动态扩展被装饰者对象的能力。</span></p>
<p style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong>示例</strong></span><strong style="font-size: 14px;">代码</strong><strong><span style="font-size: 14px;">：</span></strong></p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//被装饰对象基类Component</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Component(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Component.prototype.operation&nbsp;=&nbsp;<span class="keyword">function</span><span>(successor){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;please&nbsp;rewrite&nbsp;me&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//装饰者抽象类(Decorator)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Decorator(component){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Component.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.component&nbsp;=&nbsp;component;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Decorator.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Component();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Decorator.prototype.constructor&nbsp;=&nbsp;Decorator;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体被装饰者(ConcreteComponent)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteComponent(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Component.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteComponent.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Component();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteComponent.prototype.constructor&nbsp;=&nbsp;ConcreteComponent;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteComponent.prototype.operation&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;1.00;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体装饰者(ConcreteDecoratorA)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteDecoratorA(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Decorator.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteDecoratorA.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Decorator();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteDecoratorA.prototype.constructor&nbsp;=&nbsp;ConcreteDecoratorA;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteDecoratorA.prototype.operation&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0.15&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.component.operation();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体装饰者(ConcreteDecoratorB)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteDecoratorB(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Decorator.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteDecoratorB.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Decorator();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteDecoratorB.prototype.constructor&nbsp;=&nbsp;ConcreteDecoratorB;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteDecoratorB.prototype.operation&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0.10&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.component.operation();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;mycoffee&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteComponent();</span><span class="comment">//比如纯咖啡</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;纯咖啡的价格为：&quot;</span><span>+mycoffee.operation());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;milkcoffee&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteDecoratorA(mycoffee);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;加了牛奶的咖啡价格为：&quot;</span><span>+&nbsp;milkcoffee.operation());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;sugarmilkcoffee&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteDecoratorB(milkcoffee);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;加了牛奶、糖的咖啡价格为：&quot;</span><span>+sugarmilkcoffee.operation());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><span style="font: 14px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong>输出为：</strong><br />
</span></p>
<p style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; display: inline !important; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">纯咖啡的价格为：1<br />
</span></p>
<p style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; display: inline !important; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">加了牛奶的咖啡价格为：1.15<br />
</span></p>
<p style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; display: inline !important; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">加了牛奶、糖的咖啡价格为：1.25</span></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=125</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2012-05-13 20:51</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=124</guid>
			<title>《Head First 设计模式》读书笔记6——设计模式之职责链模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong><font face="微软雅黑">定义：</font></strong></p>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它为止。</span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><a href="http://www.footya.com//attachment.php?id=79" target="_blank"><img src="http://www.footya.com//attachments//date_201205/a141eaee945909d89fcda9470af90ece.png" border="0" alt="大小: 7.6 K&#13;尺寸: 401 x 226&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="401" height="226" /></a></span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><strong style="margin: 0px; padding: 0px; line-height: 22px; background-color: rgb(255, 255, 255);"><font face="'Microsoft Yahei'">适配器模式的角色组成：</font></strong></span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
<div><span style="font-size: 14px;"><strong>抽象处理者(Handler)角色：</strong>定义出一个处理请求的接口。如果需要，接口可以定义出一个方法，以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。</span></div>
<div><span style="font-size: 14px;"><strong>具体处理者(ConcreteHandler)角色：</strong>具体处理者接到请求后，可以选择将请求处理掉，或者将请求传给下家。由于具体处理者持有对下家的引用，因此，如果需要，具体处理者可以访问下家。</span></div>
</div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">&nbsp;</div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
<div><span style="font-size: 14px;"><strong>适用场合：</strong><span class="Apple-converted-space">&nbsp;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span></div>
<div><span style="font-size: 14px;">1.有多个的对象可以处理一个请求，哪个对象处理该请求运行时刻自动确定。</span></div>
<div><span style="font-size: 14px;">2.你想在不明确指定接受者的情况下，向多个对象中的一个提交请求。</span></div>
<div><span style="font-size: 14px;">3.处理一个请求的对象集合应被动态指定。</span></div>
<span style="font-size: 14px;">
<div>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//抽象处理者(Handler)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Handler(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.successor&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Handler.prototype.setSuccessor&nbsp;=&nbsp;<span class="keyword">function</span><span>(successor){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.successor&nbsp;=&nbsp;successor;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Handler.prototype.handleRequest&nbsp;=&nbsp;<span class="keyword">function</span><span>(request){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Error(</span><span class="string">&quot;you&nbsp;must&nbsp;overwrite&nbsp;this&nbsp;fun&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体处理者(ConcreteHandler)角色1</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteHandler1(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Handler.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler1.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Handler();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler1.prototype.constructor&nbsp;=&nbsp;ConcreteHandler1;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler1.prototype.handleRequest&nbsp;=&nbsp;<span class="keyword">function</span><span>(request){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(request&gt;=0&amp;&amp;request&lt;=10){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;0&lt;=a&lt;=10&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.successor&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//转移到下一位</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.successor.handleRequest(request);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体处理者(ConcreteHandler)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteHandler2(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Handler.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler2.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Handler();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler2.prototype.constructor&nbsp;=&nbsp;ConcreteHandler2;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler2.prototype.handleRequest&nbsp;=&nbsp;<span class="keyword">function</span><span>(request){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(request&gt;=11&amp;&amp;request&lt;=20)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;11&lt;=a&lt;=20&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.successor&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//转移到下一位</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.successor.handleRequest(request);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体处理者(ConcreteHandler)角色</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;ConcreteHandler3(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Handler.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler3.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Handler();&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler3.prototype.constructor&nbsp;=&nbsp;ConcreteHandler3;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ConcreteHandler3.prototype.handleRequest&nbsp;=&nbsp;<span class="keyword">function</span><span>(request){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(request&gt;=21&amp;&amp;request&lt;=30)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;21&lt;=a&lt;=30&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.successor&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//转移到下一位</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.successor.handleRequest(request);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;h1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteHandler1();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;h2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteHandler2();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;h3&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConcreteHandler3();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//设置职责链的上下游</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;h1.setSuccessor(h2);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;h2.setSuccessor(h3);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//开始验证</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;h1.handleRequest(21);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong style="font-size: 14px;">参考文献：</strong></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><a style="cursor: pointer;" href="http://wenku.baidu.com/view/1ab28f5277232f60ddcca1db.html"><font color="#0066cc">http://wenku.baidu.com/view/1ab28f5277232f60ddcca1db.html</font></a></span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;"><a style="cursor: pointer;" href="http://www.cnblogs.com/singlepine/archive/2005/10/30/265010.html"><font color="#0066cc">http://www.cnblogs.com/singlepine/archive/2005/10/30/265010.html</font></a></span></div>
<div style="font: 18px/normal 微软雅黑; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a style="font-size: 14px; cursor: pointer;" href="http://www.cnblogs.com/jqbird/archive/2011/09/03/2165260.html"><font color="#0066cc">http://www.cnblogs.com/jqbird/archive/2011/09/03/2165260.html</font></a></div>
</div>
</span></div>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=124</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2012-05-09 21:31</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=123</guid>
			<title>js对象深拷贝和对象扩展</title>
			<author>footya</author>
			<description><![CDATA[<p>对象深拷贝和对象扩展一直比较头疼，最近查阅了一些资料，终于想出了一个比较靠谱的方案，深拷贝的代码来自网络：<a href="http://blog.csdn.net/qq1119753812/article/details/6968054"><font color="#0066cc">http://blog.csdn.net/qq1119753812/article/details/6968054</font></a>，基于深拷贝写了个对象扩展的方法，测了一下基本可以满足日常使用。<br />
js对象深拷贝：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//对象和数组的深拷贝</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Object.clone&nbsp;=&nbsp;<span class="keyword">function</span><span>(sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>&nbsp;sObj&nbsp;!==&nbsp;</span><span class="string">&quot;object&quot;</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;sObj;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(sObj.constructor&nbsp;==&nbsp;Array){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;[];&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;</span><span class="keyword">in</span><span>&nbsp;sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]&nbsp;=&nbsp;Object.clone(sObj[i]);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;s;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>js对象扩展：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//对象扩展，tObj被扩展对象，sObj扩展对象&nbsp;</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;Object.extend&nbsp;=&nbsp;<span class="keyword">function</span><span>(tObj,sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;</span><span class="keyword">in</span><span>&nbsp;sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>&nbsp;sObj[i]&nbsp;!==&nbsp;</span><span class="string">&quot;object&quot;</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tObj[i]&nbsp;=&nbsp;sObj[i];&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(sObj[i].constructor&nbsp;==&nbsp;Array){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tObj[i]&nbsp;=&nbsp;Object.clone(sObj[i]);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tObj[i]&nbsp;=&nbsp;tObj[i]&nbsp;||&nbsp;{};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object.extend(tObj[i],sObj[i]);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
测试用例如下：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;b&nbsp;=&nbsp;{</span><span class="string">&quot;a&quot;</span><span>:1,&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;b&quot;</span><span>:{</span><span class="string">&quot;c&quot;</span><span>:</span><span class="keyword">function</span><span>(t){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(t);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;d&quot;</span><span>:{</span><span class="string">&quot;e&quot;</span><span>:2,&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;f&quot;</span><span>:[1,4,5,7,9]&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Object.extend(a,b);<span class="comment">//a获得了b的所有属性</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=123</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2011-12-27 09:59</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=122</guid>
			<title>《Head First 设计模式》读书笔记5——设计模式之适配器模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>定义：</strong><br />
将一个类的接口，转换成客户期望的另一个接口。适配器adapter使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。</p>
<p><strong>uml:</strong></p>
<p><strong>对象适配器<br />
</strong><a href="http://www.footya.com//attachment.php?id=77" target="_blank"><img src="http://www.footya.com//attachments//date_201110/5d52a530005b8af9998a2d0a10909d64.png" border="0" alt="大小: 4.73 K&#13;尺寸: 522 x 179&#13;浏览: 12 次&#13;点击打开新窗口浏览全图" width="522" height="179" /></a></p>
<p><strong>类适配器<br />
</strong><a href="http://www.footya.com//attachment.php?id=78" target="_blank"><img src="http://www.footya.com//attachments//date_201110/1af931843748e6a304eeec04e33b24db.png" border="0" alt="大小: 4.87 K&#13;尺寸: 533 x 177&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="533" height="177" /></a><br />
<strong>适配器模式的角色组成：</strong></p>
<p>1.源（Adaptee）<br />
已经存在的、需要适配的类。<br />
2.目标（Target）<br />
客户所期待的接口。目标可以是具体的或抽象的类，也可以是接口。<br />
3.适配器（Adapter）<br />
适配器模式的核心类。有两种方式实现Adapter，对象适配器(Object Adapter)和类适配器(Class Adapter)。<br />
4.客户(Client)</p>
<p><strong>适用范围：<br />
</strong>1、你想使用一个已经存在的类，而它的接口不符合你的需求。 <br />
2、你想创建一个可以复用的类，该类可以与其他不相关的类或不可预见的类（即那些接口可能不一定兼容的类）协同工作。 <br />
3、你想使用一些已经存在的子类，但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。<br />
<strong>引用书中的例子：</strong><br />
1、鸭子有两个行为飞【fly()】和叫【quack()】;<br />
2、火鸡有两个行为飞【fly()】和叫【gobble()】;<br />
3、实现一个适配器使得火鸡的行为和鸭子的行为提供一样的接口；</p>
<p><strong>js代码实现：</strong></p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//目标</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Duck(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Duck&nbsp;flying&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.quack&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Duck&nbsp;quacking&quot;</span><span>)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//源</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Turkey(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Turkey&nbsp;flying&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.gobble&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;turkey&nbsp;gobble&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//适配器</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;TurkeyAdapter(turkey){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.turkey&nbsp;=&nbsp;turkey;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;turkey.fly();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.quack&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;turkey.gobble();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//客户</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;testDuck(duck){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.quack();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.fly();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;duck&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Duck();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;turkey&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Turkey();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;turkeyadapter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;TurkeyAdapter(turkey);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;testDuck(duck);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;testDuck(turkeyadapter);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=122</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-10-20 08:29</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=121</guid>
			<title>《Head First 设计模式》读书笔记4——设计模式之命令模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>定义：</strong><br />
将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤消的操作。</p>
<p><strong>uml:</strong><br />
<a href="http://www.footya.com//attachment.php?id=75" target="_blank"><img src="http://www.footya.com//attachments//date_201110/f4e23904074d4a1a820b0dfccaf03d40.png" border="0" alt="大小: 5.57 K&#13;尺寸: 596 x 208&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="596" height="208" /></a><br />
<strong>命令模式的角色组成：<br />
</strong>1)命令角色（Command）：  定义命令的接口，声明执行的方法。<br />
2)具体命令角色（Concrete Command）：<br />
命令接口实现对象，是&ldquo;虚&rdquo;的实现；通常会持有接收者(Receiver)的引用，并调用接收者(Receiver)的功能(receiver.Action())来完成命令要执行的操作(Execute)。<br />
3)客户角色（Client）：创建具体的命令对象，并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端，而是在组装命令对象和接收者，或许，把这个Client称为装配者会更好理解，因为真正使用命令的客户端是从Invoker来触发执行。<br />
4)请求者角色（Invoker）：调用命令对象(Command)执行这个请求。<br />
5)接收者角色（Receiver）：知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。<br />
<br />
<strong>引用书中的例子：</strong><br />
实现一个开关遥控器<br />
1、遥控器上有7个编程插槽，每个插槽分别对应开、关两个按钮；<br />
2、有已经封装好的家电类，这些家电类都实现了自己的开关方法；<br />
3、遥控器上还有一个撤销按钮；<br />
4、创建一组控制遥控器的API，让每个插槽都能够控制一个或一组家电装置；<br />
5、能够控制目前的装置和未来可能出现的装置。</p>
<p><br />
我们先实现一个家电的开关，以卧室的灯来举例。</p>
<p><strong> 初步实现的UML图：</strong></p>
<p>&nbsp;<a href="http://www.footya.com//attachment.php?id=76" target="_blank"><img src="http://www.footya.com//attachments//date_201110/0b609515093bbd76ae019d9149cc9e11.png" border="0" alt="大小: 10.57 K&#13;尺寸: 751 x 238&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="751" height="238" /></a><br />
<strong>js程序实现：<br />
</strong></p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Command(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Command.prototype.execute&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;LightOnCommand&nbsp;(light){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Command.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.light&nbsp;=&nbsp;light;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>LightOnCommand.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Command();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>LightOnCommand.prototype.constructor&nbsp;=&nbsp;LightOnCommand;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>LightOnCommand.prototype.execute&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.light.on();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;SimpleRemoteControl&nbsp;(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>SimpleRemoteControl.prototype.setCommand&nbsp;=&nbsp;<span class="keyword">function</span><span>(command){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.solt&nbsp;=&nbsp;command;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>SimpleRemoteControl.prototype.buttonWasPressed&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.solt.execute();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//&nbsp;</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Light(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Light.prototype.on&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;the&nbsp;light&nbsp;on&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Light.prototype.off&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;the&nbsp;light&nbsp;off&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;RemoteControlTest(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;remote&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SimpleRemoteControl();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;light&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Light();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;lighton&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;LightOnCommand(light);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;remote.setCommand(lighton);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;remote.buttonWasPressed();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>RemoteControlTest();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=121</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-10-09 22:42</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=120</guid>
			<title>《Head First 设计模式》读书笔记3——设计模式之单件模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>单件模式（singleton）</strong></p>
<p>保证一个类仅有一个实例，并提供一个访问它的全局访问点。</p>
<p><strong>uml图示：<br />
<a href="http://www.footya.com//attachment.php?id=74" target="_blank"><img src="http://www.footya.com//attachments//date_201109/da62274e3904a11048eb2378b3861c19.png" border="0" alt="大小: 4.38 K&#13;尺寸: 421 x 140&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="421" height="140" /></a></strong></p>
<p><strong>单件模式应该使用在什么场合:<br />
</strong>　　当需要控制一个类的实例数量且调用者可以从一个公共的众所周知的访问点访问时。<br />
<strong>单件模式类的创建:<br />
</strong>　　两种方式来实现单件类的创建，一是将一个类的公共构造函数改为私有，另一种方式是保留类的公共构造函数，通过一个静态成员来决定是否要返回一个类实例。</p>
<p><strong>单件模式模式的实现基于两个要点：</strong><br />
1）不直接用类的构造函数，而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性，静态方法保证了不会创建出多余的实例。<br />
2）将类的构造函数设为Private，即将构造函数&quot;隐藏&quot;起来，任何企图使用构造函数创建实例的方法都将报错。这样就阻止了开发人员绕过上面的Instance方法直接创建类的实例。</p>
<p><strong>js代码示例：</strong></p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Singleton(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">if</span><span>(!Singleton.lock){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;alert(<span class="string">&quot;您不能直接示例化这个类&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">return</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">this</span><span>.uniqueInstance&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;Singleton.prototype.test&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;alert(<span class="string">&quot;你已经成功示例化了&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Singleton.instance&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">this</span><span>.lock&nbsp;=&nbsp;</span><span class="keyword">true</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.uniqueInstance&nbsp;==&nbsp;</span><span class="keyword">null</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">this</span><span>.uniqueInstance&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Singleton();&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.uniqueInstance;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">var</span><span>&nbsp;test1&nbsp;=&nbsp;Singleton.instance();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;test1.test();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=120</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2011-09-22 21:57</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=118</guid>
			<title>《Head First 设计模式》读书笔记2——设计模式之观察者模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>观察者模式（<span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">Observer</span>）</strong></p>
<p><span class="Apple-style-span" style="font: 12pt/22px Microsoft YaHei; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。</span></p>
<p><span class="Apple-style-span" style="font: 12pt/22px Microsoft YaHei; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">此种模式通常被用来实现事件处理系统。<br />
<span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong>UML图示：</strong></span></span></p>
<p>&nbsp;<a href="http://www.footya.com//attachment.php?id=73" target="_blank"><img src="http://www.footya.com//attachments//date_201109/a3826da58216ee367a92935443e76785.png" border="0" alt="大小: 10.43 K&#13;尺寸: 616 x 239&#13;浏览: 3 次&#13;点击打开新窗口浏览全图" width="616" height="239" /></a><br />
1、观察者（observer）<br />
（Observer）将自己注册（Attach）到被观察对象（Subject）中，被观察对象将观察者存放在一个容器（observers）里。<br />
2、被观察对象（subject）<br />
被观察对象发生了某种变化，从容器中（observers）得到所有注册过的观察者，将变化通知观察者。<br />
3、撤销观察<br />
观察者告诉被观察者要撤销（Detach）观察，被观察者从容器中将观察者去除。</p>
<p>观察者将自己注册到被观察者的容器中时，被观察者不应该过问观察者的具体类型，而是应该使用观察者的接口。这样的优点是：假定程序中还有别的观察者，那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者，当被观察者发生变化的时候，他可以将消息一一通知给所有的观察者。基于接口，而不是具体的实现&mdash;&mdash;这一点为程序提供了更大的灵活性。<br />
<br />
引用书里的例子：<br />
<strong>需求1：</strong>设计一个气象站，这个气象站可以提供温度、湿度、气压这3种数据；<br />
<strong>需求2：</strong>设计3个不同用途的公告板用来显示温度、湿度、气压等数据；<br />
<strong>需求3：</strong>每当有温度、湿度、气压变化时，气象站都要通知给各个公告板来更新显示；<br />
<strong>需求4：</strong>3个公告板中的任意一个都可以随时停止更新显示；</p>
<p><br />
UML设计如下：</p>
<p>&nbsp;<a href="http://www.footya.com//attachment.php?id=72" target="_blank"><img src="http://www.footya.com//attachments//date_201109/1695c32240a9c8dd70ffeb10acb26d56.png" border="0" alt="大小: 10.32 K&#13;尺寸: 493 x 317&#13;浏览: 4 次&#13;点击打开新窗口浏览全图" width="493" height="317" /></a></p>
<p>&nbsp;js代码的实现如下：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//主题即被观察者</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Subject(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers&nbsp;=&nbsp;[];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Subject.prototype.addObserver&nbsp;=&nbsp;<span class="keyword">function</span><span>(observer){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers.push(observer);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Subject.prototype.delObserver&nbsp;=&nbsp;<span class="keyword">function</span><span>(observer){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;len&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.observers.length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++)&nbsp;{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">this</span><span>.observers[i]&nbsp;==&nbsp;observer)&nbsp;{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers.splice(i,1);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Subject.prototype.notifyObserver&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;len&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.observers.length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++)&nbsp;{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers[i].updata(data);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//主题</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;WeatherDate(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Subject.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.states&nbsp;=&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Subject();&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.constructor&nbsp;=&nbsp;WeatherDate;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.getState&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.states;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.setState&nbsp;=&nbsp;<span class="keyword">function</span><span>(obj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.states&nbsp;=&nbsp;obj&nbsp;||&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.stateChanged&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.notifyObserver(</span><span class="keyword">this</span><span>.states);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//观察者超类</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Observer(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Observer.prototype.updata&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.data&nbsp;=&nbsp;data;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//观察者1</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;BBSone(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Observer.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Observer();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype.constructor&nbsp;=&nbsp;BBSone;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype.updata&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.data&nbsp;=&nbsp;data;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.display();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype.display&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;[];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;k&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="keyword">this</span><span>.data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;k&nbsp;+&nbsp;</span><span class="string">&quot;:&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.data[k];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(s)&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;a.join(<span class="string">&quot;/n&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;BBSone:__&quot;</span><span>&nbsp;&nbsp;+&nbsp;&nbsp;a);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//观察者2</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;BBStwo(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Observer.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Observer();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype.constructor&nbsp;=&nbsp;BBSone;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype.updata&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.data&nbsp;=&nbsp;data;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.display();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype.display&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;[];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;k&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="keyword">this</span><span>.data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;k&nbsp;+&nbsp;</span><span class="string">&quot;-&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.data[k];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(s)&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;a.join(<span class="string">&quot;\n&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;BBStwo:__&quot;</span><span>+a);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WeatherDate();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BBSone();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BBStwo();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.addObserver(a1);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.addObserver(a2);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.setState({t1:<span class="string">&quot;20&quot;</span><span>,t2:</span><span class="string">&quot;50%&quot;</span><span>,t3:</span><span class="string">&quot;0.5&quot;</span><span>});&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.stateChanged();&nbsp;<br />
    &nbsp;&nbsp;&nbsp; s.delObserver(a2);<br />
    &nbsp;&nbsp;&nbsp; s.stateChanged();</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=118</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-09-18 17:33</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=117</guid>
			<title>《Head First 设计模式》读书笔记1——设计模式之策略模式</title>
			<author>footya</author>
			<description><![CDATA[<p>最近在读《<span class="Apple-style-span" style="font: 14px/18px 宋体, Arial, Helvetica, sans-serif; text-align: left; color: rgb(102, 102, 102); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a style="margin: 0px 5px 0px 0px; padding: 0px; color: rgb(26, 102, 179); text-decoration: underline; display: inline; outline-style: none;" target="_blank" kesrc="http://product.dangdang.com/product.aspx?product_id=20021171&amp;ref=search-0-mix" ke-onclick="s('click','%C9%E8%BC%C6%C4%A3%CA%BD','01.54.10.00','53_1_30','','','','20021171_1_84607_q','','','');" href="http://product.dangdang.com/product.aspx?product_id=20021171&amp;ref=search-0-mix" name="p_name"><font color="#1a66b3">Head First<span class="Apple-converted-space"> </span></font><span class="skcolor_ljg" style="margin: 0px; padding: 0px; color: rgb(204, 51, 0); font-weight: bold;">设计模式</span></a></span>》，鉴于我记性不好，写点笔记吧。作为一个半路出家的javascript程序员，没有受过专业的训练，对于业务逻辑的分析大脑里没有一个可以依照的原则和思维模式，时常觉得很吃力。<br />
学习设计模式之前先了解一下什么是模式，以下是从网上抄来的一个定义。<br />
<span class="Apple-style-span" style="font: 13px/19px 宋体; color: rgb(255, 0, 0); text-transform: none; text-indent: 28px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">模式：每一个模式描述了一个在我们周围不断重复发生的问题，以及该问题的解决方案的核心。</span><br />
今天记录第一个设计模式&mdash;&mdash;<strong>策略模式（Strategy）</strong></p>
<p><strong>定义：<span style="font-family: Microsoft YaHei;">策略模式定义了</span><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">一系列的算法</span></span><span>，<span style="font-family: Microsoft YaHei;">并将每一个算法封装起来</span>，让它们之间可以互相替换，此模式让算法的变化独立于使用算法的客户。</span></strong></p>
<p><strong><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">（原文：The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.）</span></strong></p>
<p><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong>UML图示：</strong></span></p>
<p><strong><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a href="http://www.footya.com//attachment.php?id=71" target="_blank"><img src="http://www.footya.com//attachments//date_201109/38dc5fd42bbf18d30a739410bb5cef12.png" border="0" alt="大小: 6.19 K&#13;尺寸: 540 x 171&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="540" height="171" /></a></span></strong></p>
<p><strong><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong><span style="font-family: Microsoft YaHei; font-size: 12pt;">策略模式的组成：</span></strong><br />
抽象策略角色(strategy)： 策略类，通常由一个接口或者抽象类实现。<br />
具体策略角色(concreteStrategyA,..)：包装了相关的算法和行为。<br />
环境角色(context)：持有一个策略类的引用，最终给客户调用。<br />
</span><br />
</strong>引用书里的例子：<br />
<strong>需求1：</strong>设计一个游戏，游戏里有各种鸭子，都会游泳。<br />
<strong> 需求2：</strong>一部分鸭子会飞，一部分鸭子不会飞。<br />
<strong>需求3：</strong>可以动态改变一些鸭子的行为，比如通过道具让一些不会飞的鸭子变得会飞。</p>
<p><br />
<strong>初步设计的UML图如下：</strong></p>
<p><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a href="http://www.footya.com//attachment.php?id=70" target="_blank"><img src="http://www.footya.com//attachments//date_201109/f17955e5250f1fa7de61ff8e62d041d3.png" border="0" alt="大小: 5.51 K&#13;尺寸: 398 x 305&#13;浏览: 4 次&#13;点击打开新窗口浏览全图" width="398" height="305" /></a></span></p>
<p>Ducks是使用飞行算法的客户，也就是上面提到的<span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">环境角色(context)，持有策略类<span style="font-family: Microsoft YaHei;">FlyBehavior</span>的引用。</span></span></p>
<p><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">FlyBehavior就是上面提到的<span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">抽象策略角色(strategy)，<span style="font-family: Arial;">这里它是一个抽象类，定义了fly方法由子类实现具体的行为</span>。</span></span></span></span></p>
<p><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;"><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">FlyNoWay和FlyNoWay就是上面提到的<span style="font-family: Arial;">具体策略角色，它们继承自FlyBehavior，并实现fly方法的具体行为。</span></span></span></span></span></p>
<p>&nbsp;</p>
<p>以下是js对上述描述的实现</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//抽象策略角色&mdash;&mdash;飞行行为抽象类</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;FlyBehavior(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyBehavior.prototype.fly&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;please&nbsp;do&nbsp;the&nbsp;fly&nbsp;method&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体策略角色&mdash;&mdash;实现不能飞的策略</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;FlyNoWay(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FlyBehavior.apply(<span class="keyword">this</span><span>,arguments)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyNoWay.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;FlyBehavior();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyNoWay.prototype.constructor&nbsp;=&nbsp;FlyNoWay;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyNoWay.prototype.fly&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;I&nbsp;can't&nbsp;fly&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体策略角色&mdash;&mdash;实现能飞的策略</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;FlyWithWings(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FlyBehavior.apply(<span class="keyword">this</span><span>,arguments)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyWithWings.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;FlyBehavior();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyWithWings.prototype.constructor&nbsp;=&nbsp;FlyWithWings;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyWithWings.prototype.fly&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;I'm&nbsp;flying&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//环境角色-使用飞行策略的客户</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Ducks(fly){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._flyBehavior&nbsp;=&nbsp;fly;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._flyBehavior.fly();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;Ducks.prototype.swim&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;I'm&nbsp;swiming&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//以下执行A可以飞，B不可以飞</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;DuckA&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Ducks(</span><span class="keyword">new</span><span>&nbsp;FlyWithWings());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>DuckA.fly();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;DuckB&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Ducks(</span><span class="keyword">new</span><span>&nbsp;FlyNoWay());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>DuckB.fly();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;<br />
未完待续...(需要加上动态修改具体策略部分的逻辑)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=117</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-09-07 22:46</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=116</guid>
			<title>iPad相关的css问题总结</title>
			<author>footya</author>
			<description><![CDATA[<p><span class="Apple-style-span" style="font:/normal Simsun; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-style-span" style="line-height: 16px; font-family: Verdana, arial, sans-serif; font-size: 12px;">
<div id="content">
<div class="wiki-content" style="line-height: 16px; font-size: 11px; margin-right: 10px;">
<h3 style="margin: 3px 0px 0px; padding: 0px; color: rgb(0, 51, 102); line-height: normal; font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; border-bottom-width: 0px; background-color: rgb(240, 240, 240);"><a name="iPad%E7%9B%B8%E5%85%B3%E7%9A%84css%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93-1%E3%80%81ipad%E4%B8%8B%E6%96%87%E5%AD%97%E7%9C%8B%E8%B5%B7%E6%9D%A5%E6%9B%B4%E7%A8%80%E7%96%8F%EF%BC%8C%E5%8D%B3%E6%96%87%E5%AD%97%E9%97%B4%E7%9A%84%E9%97%B4%E8%B7%9D%E6%9B%B4%E5%A4%A7%EF%BC%9A"></a>1、ipad下文字看起来更稀疏，即文字间的间距更大：</h3>
<p style="margin: 16px 0px; padding: 0px; color: rgb(0, 0, 0); line-height: 16px; font-family: Verdana, arial, sans-serif; font-size: 11px; font-weight: normal;">表现：pc正好的文字在ipad下看可能折行<br />
解决办法：缩小ipad的字间距如羡慕css代码</p>
<div class="code panel" style="margin: 0px 10px 10px; padding: 0px; border: 1px dashed rgb(60, 120, 181); color: black; line-height: 13px; font-family: Courier; font-size: 11px; overflow-x: auto; overflow-y: auto; background-color: rgb(255, 255, 255);">
<div class="codeContent panelContent" style="margin: 0px; padding: 5px; text-align: left; color: rgb(0, 0, 0); font-size: 0.95em; background-color: rgb(240, 240, 240);">
<pre class="code-java" style="margin: 5px 5px 5px 15px; padding: 0px; text-align: left; line-height: 1.3; font-family: &quot;Courier New&quot;, Courier, monospace; overflow-x: auto; overflow-y: auto;">/*以下css只有ipad可以识别*/ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px){  .partA .one_r strong{letter-spacing:-1px;} }</pre>
</div>
</div>
<h3 style="margin: 20px 0px 0px; padding: 0px; color: rgb(0, 51, 102); line-height: normal; font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; border-bottom-width: 0px; background-color: rgb(240, 240, 240);"><a name="iPad%E7%9B%B8%E5%85%B3%E7%9A%84css%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93-2%E3%80%81ipad%E4%B8%8B%E7%9A%84%E6%A8%A1%E5%9D%97%E5%B1%85%E4%B8%AD%E6%9C%89%E6%97%B6%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8"></a>2、ipad下的模块居中有时不起作用</h3>
<p style="margin: 16px 0px; padding: 0px; color: rgb(0, 0, 0); line-height: 16px; font-family: Verdana, arial, sans-serif; font-size: 11px; font-weight: normal;">表现：pc模块可以居中ipad下有时就不居中<br />
解决办法：模块除了定宽和margin auto后，需要设置overflow:hidden阻止模块内元素溢出</p>
</div>
</div>
</span></span></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=116</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2011-08-08 22:33</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=115</guid>
			<title>haslayout对动态改变布局的影响</title>
			<author>footya</author>
			<description><![CDATA[<p>最近又碰到一个很诡异的css问题，把下面这段代码用ie6/7运行试试：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN&quot;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=utf-8&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;s1&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span class="tag">&gt;</span><span>s1</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;s2&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;display:none;position:absolute;left:120px;top:20px;&quot;</span><span class="tag">&gt;</span><span>s2</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;s3&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;margin-top:50px;zoom:1;&quot;</span><span class="tag">&gt;</span><span>s3</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">s1</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById(&quot;s1&quot;);&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">s2</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById(&quot;s2&quot;);&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">s3</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById(&quot;s3&quot;);&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s1.onmouseover</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">function</span><span>(e){&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s2.style.display</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;&quot;</span><span>;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s1.onmouseout</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">function</span><span>(e){&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s2.style.display</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;none&quot;</span><span>;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><strong>现象：</strong><br />
IE6/7下<br />
鼠标滑过s1时，s2显示，s3会向上跳，<br />
鼠标滑出s1时，s2隐藏，s3回到原位，<br />
s3的这个跳动是我们不希望的。<br />
<br />
<strong>原因：</strong><br />
IE6\7下s3元素拥有haslayout后，s2的显示和隐藏会对s3的margin有影响<br />
鼠标滑过s1时，s2显示，s3的margin-top属性会失效<br />
鼠标滑出s1时，s2隐藏，s3的margin-top属性又生效<br />
<br />
<strong>解决办法：</strong><br />
<s>1、去掉s3上的zoom属性，或者再加zoom:0可以消除这个影响;</s>（这个方法只对没有宽高的元素起作用）<br />
2、s3的margin-top属性修改为padding-top;<br />
3、s3和s2之间插入任意字符；<br />
4、s3里面再加一层div s4把margin-top属性写在s4上;
<br />
上面任意一种办法都可以解决这个问题，你可以试着找找，欢迎把有创意的好办法反馈回来</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=115</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2011-07-20 23:01</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=114</guid>
			<title>伪类对IE9 css透明属性的影响</title>
			<author>footya</author>
			<description><![CDATA[<p>如果不是IE9下遇到诡异的显示问题，怎么也不会把伪类和透明联系起来，最近的项目遇到了这样的问题：<br />
js动态设置一个容器为不透明，但是IE9下鼠标一滑过这个容器这个容器就不见了。各种手段调试了很久才发现，这个问题原来是因为IE9同时支持opacity和filter导致的。<br />
经过反复测试得出如下结论：<br />
1、IE9同时支持filter和opacity；<br />
<br />
2、filter的优先级更高 <br />
&nbsp;filter:alpha(opacity=0)；opacity:1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 透明 <br />
&nbsp;filter:alpha(opacity=100)；opacity:0;&nbsp; 不透明 <br />
<br />
3、单独使用都可以起作用<br />
&nbsp;filter:alpha(opacity=50) <br />
&nbsp;opacity:0.5 <br />
<br />
4、css伪类(除a:hover)&nbsp;&nbsp;&nbsp; <br />
li:hover{}会触发opacity生效<br />
&nbsp;&nbsp;filter:alpha(opacity=0)；opacity:1;默认不透明<br />
&nbsp;&nbsp;鼠标滑过会触发filter生效，变为透明&nbsp;<br />
<br />
li:active{} 点击时有类型的表现<br />
&nbsp; filter:alpha(opacity=0)；opacity:1;默认不透明<br />
&nbsp;&nbsp; 鼠标滑过会触发filter生效，变为透明 <br />
<br />
查看示例：<a target="_blank" href="http://www.footya.com/demo/ie9/hover.html">《IE9 css伪类对透明属性的影响测试》</a></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=114</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2011-06-21 22:28</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=113</guid>
			<title>apache ssi 配置</title>
			<author>footya</author>
			<description><![CDATA[<p>&nbsp;httpd.conf文件<br />
#AddType text/html .shtml<br />
&nbsp;#AddOutputFilter INCLUDES .shtml<br />
替换成：<br />
AddType text/html .html<br />
AddOutputFilter INCLUDES .html</p>
<p>html文件里这样写就可以引入所需代码<br />
&lt;!--#include file=&quot;gui_Header.html&quot;--&gt;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=113</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-04-09 08:22</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=109</guid>
			<title>apache配置 php中没有php5apache2_2.dll的原因及解决办法</title>
			<author>footya</author>
			<description><![CDATA[<p>在给apache配置php的过程中,如果php安装目录里没有php5apache2_2.dll,一定是下载的版本不对。 <br />
php 5.3.4有v9版和v6好几个版本 <br />
网站左边有几段文字: <br />
which version do i choose?<br />
if you are using php with apache 1 or apache2 from apache.org you need to use the vc6 versions of php <br />
所以要下载v6c versions of php ，<br />
v6c又有两个版本如下：<br />
vc6 x86 non thread safe <br />
vc6 x86 thread safe <br />
以上两个版本中，non thread safe版的php在安装过程中,<br />
没有apache的选项: <br />
select the web server you wish to setup <br />
iis fastcgi <br />
other cgi <br />
do not setup a web server<br />
<br />
而thread safe版的安装过程中有apache 2.2.x module选项:<br />
select the web server you wish to setup<br />
apache 2.2.x module <br />
apache cgi<br />
iis fastcgi <br />
iis cgi <br />
nsapi <br />
xitami<br />
netserve web server <br />
other cgi <br />
do not setup a web server <br />
------------------------- <br />
所以应该下载的版本是 php 5.3.4vc6 x86 thread safe 去php官网下载,http://windows.php.net/download</p>
<p>有关apache的安装和配置请参照：<a target="_blank" href="http://tech.163.com/06/0206/11/299AMBLT0009159K.html">《Apache+php+mysql在windows下的安装与配置图解（最新版）》</a></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=109</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-02-27 10:36</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=108</guid>
			<title>Apache的Mode Rewrite模块的简单试用</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>1</strong>、在[Apache安装目录]/conf/httpd.conf中找到<br />
#LoadModule rewrite_module modules/mod_rewrite.so，去掉前面的注释符号#。<br />
<strong>2</strong>、在[Apache安装目录]/conf/httpd.conf中找到<br />
&lt;Directory /&gt;<br />
&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br />
&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp;&nbsp;&nbsp; Order deny,allow<br />
&nbsp;&nbsp;&nbsp; Deny from all<br />
&lt;/Directory&gt;<br />
把&ldquo;AllowOverride None&rdquo;改成&ldquo;AllowOverride All&rdquo;<br />
<strong>3</strong>、在[Apache安装目录]/conf/httpd.conf中增加<br />
RewriteEngine on <br />
#RewriteBase /<br />
RewriteRule ^/$ /new [R] <br />
<font color="#ff0000">*</font><font color="#ff0000">以上规则的意思是访问根目录时定向到/new文件下</font></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=108</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-02-12 15:58</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=107</guid>
			<title>软件设计师培训领悟</title>
			<author>footya</author>
			<description><![CDATA[<p>能有这次培训机会纯属意外，短期的培训不是丰胸，不可能立刻就见效，培训只是提供一些思考方式和思路，为自己以后得设计提供一个参考，总之还是有点用处的。<br />
感悟如下： <br />
1、停止抱怨，不要老是怪需求变更等等；<br />
2、提高自身素质，从小事做起，产品的好坏和程序员的素质息息相关；<br />
3、从重构一步步到优秀；<br />
4、克服代码的不良习惯，避免代码坏味道，避免大泥球；<br />
5、架构和设计没有严格的界限，源代码也是设计；<br />
6、需求的隐形成本需要能够描述清楚； <br />
7、好的设计是1）实现需求，2）便于理解，3）可以应对变化； <br />
8、架构图需要分开维度，不同的人关注不同的东西；<br />
9、好好学习下设计模式，运用到自己的项目里去，及时开始用的很烂也要去尝试；<br />
10、兵熊熊一个，将熊熊一窝，架构设计师的好坏决定着项目的成败；</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=107</link>
			<category domain="http://www.footya.com//?cid=6">我参与的</category>
			<pubDate>2010-10-27 23:00</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=106</guid>
			<title>[译]iPad css布局在横向和纵向下的定位方法</title>
			<author>footya</author>
			<description><![CDATA[<p><a href="http://www.footya.com//attachment.php?id=69" target="_blank"><img src="http://www.footya.com//attachments//date_201010/bc8c2f8e43997d211e25cdbca1d7ccc4.jpg" border="0" alt="大小: 27.85 K&#13;尺寸: 800 x 230&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="800" height="230" /></a><br />
原文：《<a href="http://matthewjamestaylor.com/blog/ipad-layout-with-landscape-portrait-modes"><font face="Comic Sans MS">iPad CSS Layout with landscape / portrait orientation modes</font></a>》</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iPad今天终于登陆澳大利亚了，尽情<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="color: rgb(51,51,51); font-size: 14px" class="Apple-style-span">欢呼吧！我准备尽快入手一台，这样就能继续完善我的css布局了使其尽可能的支持更多的设备了。可惜我现在还得继续使用iPhone SDK提供的iPad仿真器。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了庆祝iPad登陆我做了一个特别的 <a href="http://matthewjamestaylor.com/demos/ipad-css-layout/index.html">iPad网站布局</a>，这个布局只用css就能实现iPad 横向和竖向的布局变化。这个布局可以从文章的结尾或者我的iPad示例页免费下载。<br />
下面是这两种布局的一个简单的示意图：<br />
<a href="http://www.footya.com//attachment.php?id=67" target="_blank"><img src="http://www.footya.com//attachments//date_201010/b9bf36ea85620f43a659b960b09f2eda.jpg" border="0" alt="大小: 16.11 K&#13;尺寸: 500 x 303&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="500" height="303" /></a><br />
在横向（Landscape）的布局里有两列。主体内容在左边宽的一列里，三个碎块垂直叠在比较拥挤的右侧。当你把iPad竖起来时这个界面变为只有一列的设计。在竖向（Portrait）的布局里，主体内容占据了整个屏的宽度，剩下的三部分按三列横向依次定位到主体内容的下面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这两种布局里有一个位于顶端的标头和一个位于地部的页脚。他们在横向时宽1024px，纵向时宽768px。看我的<a href="http://matthewjamestaylor.com/demos/ipad-css-layout/index.html"><font color="#333333">演示页</font></a>可以看到更详细的精确到像素的范围。以下是我的演示页在iPad模拟器里的截图：<br />
</span></span><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="color: rgb(51,51,51); font-size: 14px" class="Apple-style-span"><a href="http://www.footya.com//attachment.php?id=68" target="_blank"><img src="http://www.footya.com//attachments//date_201010/b1c84bb32e50c71b70e02c133ba9a244.jpg" border="0" alt="大小: 51.46 K&#13;尺寸: 500 x 269&#13;浏览: 24 次&#13;点击打开新窗口浏览全图" width="500" height="269" /></a><br />
<strong>这是怎么做到的？<br />
</strong>首先我按1:1比例限定了这两种布局下的宽度使得它们能和iPad精确到像素的完全吻合。我用到了下面的META 标签：<br />
</span></span>这个变换布局的方法在没有JavaScript的帮助下就可以非常完美的工作。查看我的iPad布局示例或者直接下载示例文件亲自试一试。<a href="http://matthewjamestaylor.com/demos/ipad-css-layout/index.html">Demo</a>&nbsp;&nbsp; <a href="http://matthewjamestaylor.com/demos/ipad-css-layout/ipad-css-layout.zip"><font color="#00ff00">Download</font></a>(<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 48px; font-family: Verdana, Geneva, sans-serif; color: rgb(102,102,102); font-size: 16px" class="Apple-style-span"><font size="2" face="Comic Sans MS">ipad-css-layout.zip - 41kb</font></span></span>)<br />
希望你们能够喜欢这篇文章。如果你正在用你的iPad读这篇文章。。。那么你真是太幸运了：）。</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;viewport&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;width=768px,&nbsp;minimum-scale=1.0,&nbsp;maximum-scale=1.0&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>以1:1的比例限定布局可以在iPad旋转时防止放大甚至溢出到正常的屏幕之外（通常，横向时更容易被放大，因为网页的被横跨1024px显示，与横向相比纵向时只有768px的宽度是可用的）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来结合这些我要利用一些css的规则来改变在竖向和横向下的布局。我能做到这些是利用@media的相关规则在竖向时把横向布局的css样式覆盖掉。下面是一些相关的css片断：</p>
<div class="codeText">
<div class="codeHead">CSS代码</div>
<ol class="dp-css">
    <li class="alt"><span><span class="comment">/*normal&nbsp;styles&nbsp;here&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="colors">#wrap</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">width</span><span>:</span><span class="string">1024px</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>@media&nbsp;only&nbsp;</span><span class="string">screen</span><span>&nbsp;and&nbsp;(orientation:</span><span class="string">portrait</span><span>){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;portrait&nbsp;styles&nbsp;here&nbsp;*/</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="colors">#wrap</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">width</span><span>:</span><span class="string">768px</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>--------------------------译文完-------------------------</p>
<p>文章并非逐字逐句翻译，很多都是按自己的理解写的，文章里的例子并没有用iPad试过，因为俺还没有：（。<br />
此篇文章献给我曾经拥有过的好运，刚抽中的iPad就被取消了，很是郁闷，希望自己那天能真正拥有iPad的：）。</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=106</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2010-10-22 15:23</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=102</guid>
			<title>一场关于用户体验的争论</title>
			<author>footya</author>
			<description><![CDATA[<p>今天和同事讨论一个设计的合理性，悟到了一些东西。<br />
先看两张图吧，以下两张图式针对项目里联系人分组模块的两种设计：</p>
<p><a href="http://www.footya.com//attachment.php?id=64" target="_blank"><img src="http://www.footya.com//attachments//date_201009/5f164a6fa6495c88c326b06c9fb8edf4.png" border="0" alt="大小: 10.04 K&#13;尺寸: 476 x 358&#13;浏览: 3 次&#13;点击打开新窗口浏览全图" width="476" height="358" /></a><br />
图1：所有分组放在上面，如果分组个数超出宽度可以容纳的范围，会在两边出现通过点击可以滑动的小箭头。<br />
<a href="http://www.footya.com//attachment.php?id=65" target="_blank"><img src="http://www.footya.com//attachments//date_201009/725ecd137982acecc64e4e7787188164.png" border="0" alt="大小: 11.33 K&#13;尺寸: 543 x 358&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="543" height="358" /></a><br />
图2：所有分组放在左边，分组一直向下延伸，有多少个显示多少个。<br />
<br />
<strong>两种设计的对比</strong>：</p>
<p><strong>维度1</strong>【美观程度】：<br />
图1的设计操作看起来更酷一点，喜欢炫酷效果的人可能会更喜欢第一种。<br />
图2的设计简单直观，所有分组一目了然，这样的界面也会赢得很多人的喜欢。</p>
<p><strong>维度2</strong>【操作成本】：<br />
图1的设计要看第一个分组还好说直接点击一下就可以了，但是当分组多了以后，如果要看最后一个的时候就惨了，首先要把鼠标移动到右边那个很小的箭头上，接下来点击这个箭头，如果分组多的话需要点击很多次箭头才能到达最后一个。<br />
图2的设计只需移动鼠标到分组页签，一次点击操作就可以看到自己想看的分组，如果分组多的话最多再滚几下滚轮，相比起来这个设计的操作成本要比图1小很多。</p>
<p><strong>维度3</strong>【搜索】：<br />
图1的设计页签处只能显示固定个数的分组，多出来的分组不点击箭头是不会显示出来的。图2的设计所有分组页签都显示在页面上。如果找不到分组，想要ctrl+F搜索的时候图2的优势就显示出来了。</p>
<p><strong>维度4</strong>【开发成本】：<br />
图1的设计复杂度高于图2，从页面制作到js逻辑实现都要比图2复杂很多，需要些更多的代码才能实现，开发成本不言而喻。</p>
<p>现在看来该选择哪一种设计就一目了然了。其实这个时候再回头看看最原始的设计就会发现上面两个已经是很大的进步了原始的设计如下图3：<br />
<a href="http://www.footya.com//attachment.php?id=66" target="_blank"><img src="http://www.footya.com//attachments//date_201009/b0f7e71a4335e50da9535f7294a90217.png" border="0" alt="大小: 11.18 K&#13;尺寸: 400 x 481&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="400" height="481" /></a>。</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=102</link>
			<category domain="http://www.footya.com//?cid=10">用户体验</category>
			<pubDate>2010-09-08 00:29</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=101</guid>
			<title>琐事</title>
			<author>footya</author>
			<description><![CDATA[<p>看了下上一篇正式博文的时间到现在已经过去9个多月了，期间很长一段时间没有写东西，一方面是因为自己很懒，另一方面是因为域名出了点小问题，被迫关闭了半年多。在这巧无声息的9个月里，曾经有很多感悟和积累想写下来，都因为博客出问题偷懒了，趁着现在有点记忆捡点碎片吧。 <br />
<strong>1、户外</strong>：首先感谢美女格子，带我进入户外这个圈子，让我的业余生活变的丰富多彩，心态也变得更加乐观向上，更重要的是让我遇到了温柔、善良、贤惠等等优点的花花。感悟：&ldquo;你怎么对待生活，生活就会怎么对待你&rdquo;。<br />
<strong> 2、辞职</strong>：在纠结了3个多月以后，最终选择离开待了将近3年的新浪，很怀念那激情澎湃的日子和那些满怀理想的人们，是他们让我快速成长。新浪论坛、新浪吧、新浪页面构建、新浪RIA、新浪邮箱所有的这些都将是我宝贵的经历。 <br />
<strong>3、旅行</strong>：今年到目前为止去过的地方有济南(很暖和，但是不太干净)、青岛(一尘不染的美)、杭州(我的G1被永远的留在了那)、南京(厚重的像一位老人)、漠河(那里拥有目前为止很难见到的朴实人群)、北极村(中国最北，传说可以看到北极光的地方)、哈尔滨(一个很有情调的地方)。。。接下来会去哪我也不知道，总之如果时间和资金允许我不会停下来。 <br />
<strong>4、尊重</strong>：新的工作承担了新的责任，开始压力很大，自己在压力中磨练也在压力中成长。虽然团队在磨合过程中产生了一些冲突，但是只要大家心无恶意互相尊重，一切都不是问题。 <br />
<strong>5、自律</strong>：多与积极向上的人交流，不与满腹牢骚的愤青一起抱怨，环境不会因为抱怨而变好，只会因你积极向上而有所改善，情绪是可以传染的。自己要做的自律自省，不受别人影响也不要传染别人。 <br />
<strong>6、管理</strong>：新的工作有机会尝试一些管理类的事情，从面试、项目评估、任务分配再到一起做事情，学到了很多也结识了不少新朋友。 <br />
<strong>7、运动</strong>：很开心新的公司也开了游泳俱乐部，八中的游泳馆，50m、8泳道、都2M深，太爽了，重来没见过这么宽敞的游泳池。下一步准备参加羽毛球俱乐部，让身体接受全方位的锻炼。</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=101</link>
			<category domain="http://www.footya.com//?cid=4">最近心情</category>
			<pubDate>2010-08-30 20:58</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=100</guid>
			<title>博客程序修复</title>
			<author>footya</author>
			<description><![CDATA[<p>试试</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=100</link>
			<category domain="http://www.footya.com//?cid=4">最近心情</category>
			<pubDate>2010-08-24 23:53</pubDate>
		</item>
	</channel>
</rss>

