﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-andy's blog-文章分类-设计模式</title><link>http://www.blogjava.net/zhoumin007/category/9003.html</link><description>记录我的所做所思</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:40:16 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:40:16 GMT</pubDate><ttl>60</ttl><item><title>Singleton</title><link>http://www.blogjava.net/zhoumin007/articles/38287.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Thu, 30 Mar 2006 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/38287.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/38287.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/38287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/38287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/38287.html</trackback:ping><description><![CDATA[一：<br />    某些情况下一个类只能有一个实例，如thread pool,caches,objects that handle preferences and registry settings,objects used for logging,对这些情况下如果产生多于一个的实例会导致不正常的行为和浪费资源。<br />   
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_23_523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_523_Open_Text.style.display='none'; Codehighlighter1_23_523_Closed_Image.style.display='inline'; Codehighlighter1_23_523_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_23_523_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_523_Closed_Text.style.display='none'; Codehighlighter1_23_523_Open_Image.style.display='inline'; Codehighlighter1_23_523_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Singleton </span><span id="Codehighlighter1_23_523_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_23_523_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Singleton singleton;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 设为private，外界不能通过new的方法来获得一个实例。</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_128_131_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_131_Open_Text.style.display='none'; Codehighlighter1_128_131_Closed_Image.style.display='inline'; Codehighlighter1_128_131_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_128_131_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_128_131_Closed_Text.style.display='none'; Codehighlighter1_128_131_Open_Image.style.display='inline'; Codehighlighter1_128_131_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Singleton() </span><span id="Codehighlighter1_128_131_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_128_131_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> synchronized如果加在方法定义处，开销相对较大</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_206_457_Open_Image" onclick="this.style.display='none'; Codehighlighter1_206_457_Open_Text.style.display='none'; Codehighlighter1_206_457_Closed_Image.style.display='inline'; Codehighlighter1_206_457_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_206_457_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_206_457_Closed_Text.style.display='none'; Codehighlighter1_206_457_Open_Image.style.display='inline'; Codehighlighter1_206_457_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Singleton getInstance() </span><span id="Codehighlighter1_206_457_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_206_457_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_233_434_Open_Image" onclick="this.style.display='none'; Codehighlighter1_233_434_Open_Text.style.display='none'; Codehighlighter1_233_434_Closed_Image.style.display='inline'; Codehighlighter1_233_434_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_233_434_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_233_434_Closed_Text.style.display='none'; Codehighlighter1_233_434_Open_Image.style.display='inline'; Codehighlighter1_233_434_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (singleton </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_233_434_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_233_434_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">必须处理多线程带来的问题，如果thread1执行到上一步，同时thread2也执行到上一步，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">都判断出singleton==null 就会得到两个实例。</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_356_430_Open_Image" onclick="this.style.display='none'; Codehighlighter1_356_430_Open_Text.style.display='none'; Codehighlighter1_356_430_Closed_Image.style.display='inline'; Codehighlighter1_356_430_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_356_430_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_356_430_Closed_Text.style.display='none'; Codehighlighter1_356_430_Open_Image.style.display='inline'; Codehighlighter1_356_430_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> (Singleton.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_356_430_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_356_430_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_385_425_Open_Image" onclick="this.style.display='none'; Codehighlighter1_385_425_Open_Text.style.display='none'; Codehighlighter1_385_425_Closed_Image.style.display='inline'; Codehighlighter1_385_425_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_385_425_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_385_425_Closed_Text.style.display='none'; Codehighlighter1_385_425_Open_Image.style.display='inline'; Codehighlighter1_385_425_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (singleton </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_385_425_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_385_425_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    singleton </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Singleton();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> singleton;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_483_521_Open_Image" onclick="this.style.display='none'; Codehighlighter1_483_521_Open_Text.style.display='none'; Codehighlighter1_483_521_Closed_Image.style.display='inline'; Codehighlighter1_483_521_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_483_521_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_483_521_Closed_Text.style.display='none'; Codehighlighter1_483_521_Open_Image.style.display='inline'; Codehighlighter1_483_521_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> display() </span><span id="Codehighlighter1_483_521_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_483_521_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">singleton</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><img src ="http://www.blogjava.net/zhoumin007/aggbug/38287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-30 17:15 <a href="http://www.blogjava.net/zhoumin007/articles/38287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Iterator</title><link>http://www.blogjava.net/zhoumin007/articles/38278.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Thu, 30 Mar 2006 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/38278.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/38278.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/38278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/38278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/38278.html</trackback:ping><description><![CDATA[
		<p>一：<br />     聚集的方式有多种(Vector,ArrayList,Queue,HashSet,Array)等，对存取删对象的方式各不相同，为了统一接口，使用Iterator模式，客户端和具体Collection中间增加一层Iterator。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_47_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_276_Open_Text.style.display='none'; Codehighlighter1_47_276_Closed_Image.style.display='inline'; Codehighlighter1_47_276_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_47_276_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_47_276_Closed_Text.style.display='none'; Codehighlighter1_47_276_Open_Image.style.display='inline'; Codehighlighter1_47_276_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> ArrayIterator </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> Iterator </span>
				<span id="Codehighlighter1_47_276_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_47_276_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> Object[] arr;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> index</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_130_151_Open_Image" onclick="this.style.display='none'; Codehighlighter1_130_151_Open_Text.style.display='none'; Codehighlighter1_130_151_Closed_Image.style.display='inline'; Codehighlighter1_130_151_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_130_151_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_130_151_Closed_Text.style.display='none'; Codehighlighter1_130_151_Open_Image.style.display='inline'; Codehighlighter1_130_151_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> ArrayIterator(Object[] arr) </span>
						<span id="Codehighlighter1_130_151_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_130_151_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.arr </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> arr;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_179_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_179_223_Open_Text.style.display='none'; Codehighlighter1_179_223_Closed_Image.style.display='inline'; Codehighlighter1_179_223_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_179_223_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_179_223_Closed_Text.style.display='none'; Codehighlighter1_179_223_Open_Image.style.display='inline'; Codehighlighter1_179_223_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> hasNext() </span>
						<span id="Codehighlighter1_179_223_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_179_223_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> index</span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000">arr.length</span>
								<span style="COLOR: #000000">?</span>
								<span style="COLOR: #0000ff">true</span>
								<span style="COLOR: #000000">:</span>
								<span style="COLOR: #0000ff">false</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_247_274_Open_Image" onclick="this.style.display='none'; Codehighlighter1_247_274_Open_Text.style.display='none'; Codehighlighter1_247_274_Closed_Image.style.display='inline'; Codehighlighter1_247_274_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_247_274_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_247_274_Closed_Text.style.display='none'; Codehighlighter1_247_274_Open_Image.style.display='inline'; Codehighlighter1_247_274_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> Object next() </span>
						<span id="Codehighlighter1_247_274_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_247_274_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> arr[index</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>这样数组也有了Iterator接口，客户端不用管是用数组存的对象还是List，都用Iterator的方法统一处理。<br /><br />  <strong>The Iterator Pattern</strong> provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.<img src ="http://www.blogjava.net/zhoumin007/aggbug/38278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-30 16:33 <a href="http://www.blogjava.net/zhoumin007/articles/38278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Template</title><link>http://www.blogjava.net/zhoumin007/articles/38271.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Thu, 30 Mar 2006 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/38271.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/38271.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/38271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/38271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/38271.html</trackback:ping><description><![CDATA[一：<br />    准备饮料的方法：<br />    
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_21_138_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_138_Open_Text.style.display='none'; Codehighlighter1_21_138_Closed_Image.style.display='inline'; Codehighlighter1_21_138_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_21_138_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_21_138_Closed_Text.style.display='none'; Codehighlighter1_21_138_Open_Image.style.display='inline'; Codehighlighter1_21_138_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Coffee()</span><span id="Codehighlighter1_21_138_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_21_138_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_50_126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_126_Open_Text.style.display='none'; Codehighlighter1_50_126_Closed_Image.style.display='inline'; Codehighlighter1_50_126_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_50_126_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_126_Closed_Text.style.display='none'; Codehighlighter1_50_126_Open_Image.style.display='inline'; Codehighlighter1_50_126_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> prepareRecipe()</span><span id="Codehighlighter1_50_126_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_50_126_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  boilWater();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  brewCoffeeGrinds();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  pourInCup();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  addSugarAndMilk();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/dot.gif" />..</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_158_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_264_Open_Text.style.display='none'; Codehighlighter1_158_264_Closed_Image.style.display='inline'; Codehighlighter1_158_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_158_264_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_158_264_Closed_Text.style.display='none'; Codehighlighter1_158_264_Open_Image.style.display='inline'; Codehighlighter1_158_264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Tea()</span><span id="Codehighlighter1_158_264_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_158_264_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_187_262_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_262_Open_Text.style.display='none'; Codehighlighter1_187_262_Closed_Image.style.display='inline'; Codehighlighter1_187_262_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_187_262_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_262_Closed_Text.style.display='none'; Codehighlighter1_187_262_Open_Image.style.display='inline'; Codehighlighter1_187_262_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> prepareRecipe()</span><span id="Codehighlighter1_187_262_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_187_262_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  boilWater();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  steepTeaBag();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  pourInCup();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  addLemon();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/dot.gif" />..</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>可以发现，这两个类中prepareRecipe()方法，部分代码是一样的，所以把这个方法提到基类中，其中boilWater()和pourInCup()方法所有子类都是一样的，可以在基类实现，其它两个方法为abstract，又具体子类来实现。<br /> <br /><strong>The Template Pattern</strong> defines the skeleton of an alogrithm in a method,deffering some steps to subclass.<br />                                   Template Pattern lets subclass redefine certain steps of an alogrithm without changing the alogrithm's structure.<img src ="http://www.blogjava.net/zhoumin007/aggbug/38271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-30 15:56 <a href="http://www.blogjava.net/zhoumin007/articles/38271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Proxy</title><link>http://www.blogjava.net/zhoumin007/articles/38268.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Thu, 30 Mar 2006 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/38268.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/38268.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/38268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/38268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/38268.html</trackback:ping><description><![CDATA[
		<p>一：<br />     某些情况下客户不想或不能直接引用一个对象，而代理对象可以在客户端和目标对象之间起中介作用<br />    1：远程(remote)代理：访问不同在一个JVM的类的方法。<br />    2：虚拟(virtual)代理：根据需要创建一个资源消耗较大的对象，使得此对象只在真正需要时才创建<br />                                        (如加载图片)<br />    3：智能引用(smart reference)代理：当一个对象被引用时，提供一些额外的操作，比如将此对象调用的<br />                                                               次数记录下来。<br />    4：保护(protection)代理：控制一个对象的访问（权限控制）。<br />   </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">查询代理类</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_54_650_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_650_Open_Text.style.display='none'; Codehighlighter1_54_650_Closed_Image.style.display='inline'; Codehighlighter1_54_650_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_54_650_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_650_Closed_Text.style.display='none'; Codehighlighter1_54_650_Open_Image.style.display='inline'; Codehighlighter1_54_650_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SearcherProxy </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> Searcher</span>
				<span id="Codehighlighter1_54_650_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_54_650_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> Searcher searcher;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> SearcherProxy()<br /><img id="Codehighlighter1_109_151_Open_Image" onclick="this.style.display='none'; Codehighlighter1_109_151_Open_Text.style.display='none'; Codehighlighter1_109_151_Closed_Image.style.display='inline'; Codehighlighter1_109_151_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_109_151_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_109_151_Closed_Text.style.display='none'; Codehighlighter1_109_151_Open_Image.style.display='inline'; Codehighlighter1_109_151_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_109_151_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_109_151_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        searcher</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> RealSearcher();</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">真正的查询类</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_211_361_Open_Image" onclick="this.style.display='none'; Codehighlighter1_211_361_Open_Text.style.display='none'; Codehighlighter1_211_361_Closed_Image.style.display='inline'; Codehighlighter1_211_361_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_211_361_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_211_361_Closed_Text.style.display='none'; Codehighlighter1_211_361_Open_Image.style.display='inline'; Codehighlighter1_211_361_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> String doSearch(String userId, String searchType) </span>
						<span id="Codehighlighter1_211_361_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_211_361_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (checkAccess(userId))<br /><img id="Codehighlighter1_242_338_Open_Image" onclick="this.style.display='none'; Codehighlighter1_242_338_Open_Text.style.display='none'; Codehighlighter1_242_338_Closed_Image.style.display='inline'; Codehighlighter1_242_338_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_242_338_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_242_338_Closed_Text.style.display='none'; Codehighlighter1_242_338_Open_Image.style.display='inline'; Codehighlighter1_242_338_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_242_338_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_242_338_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String result</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">searcher.doSearch(</span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000">,searchType);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            logUsage(userId);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> result;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">检查权限</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> checkAccess(String userId)<br /><img id="Codehighlighter1_416_511_Open_Image" onclick="this.style.display='none'; Codehighlighter1_416_511_Open_Text.style.display='none'; Codehighlighter1_416_511_Closed_Image.style.display='inline'; Codehighlighter1_416_511_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_416_511_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_416_511_Closed_Text.style.display='none'; Codehighlighter1_416_511_Open_Image.style.display='inline'; Codehighlighter1_416_511_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_416_511_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_416_511_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        AccessValidater validater</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> AccessValidater();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> validater.validateUser(userId);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">记录使用情况</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> logUsage(String userId)<br /><img id="Codehighlighter1_562_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_562_648_Open_Text.style.display='none'; Codehighlighter1_562_648_Closed_Image.style.display='inline'; Codehighlighter1_562_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_562_648_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_562_648_Closed_Text.style.display='none'; Codehighlighter1_562_648_Open_Image.style.display='inline'; Codehighlighter1_562_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_562_648_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_562_648_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        UserLogger logger</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> UserLogger();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        logger.setUserId(userId);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        logger.save();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">客户端使用</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> main(String[] args)<br /><img id="Codehighlighter1_49_150_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_150_Open_Text.style.display='none'; Codehighlighter1_49_150_Closed_Image.style.display='inline'; Codehighlighter1_49_150_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_49_150_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_150_Closed_Text.style.display='none'; Codehighlighter1_49_150_Open_Image.style.display='inline'; Codehighlighter1_49_150_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span>
				<span id="Codehighlighter1_49_150_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_49_150_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Searcher searcher</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> SearcherProxy();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(searcher.doSearch(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">admin</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">haha</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
				</span>
		</div>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/zhoumin007/aggbug/38268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-30 15:34 <a href="http://www.blogjava.net/zhoumin007/articles/38268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade</title><link>http://www.blogjava.net/zhoumin007/articles/38221.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Thu, 30 Mar 2006 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/38221.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/38221.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/38221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/38221.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/38221.html</trackback:ping><description><![CDATA[一：<br />     一个看dvd的例子：通常做法：先调节灯光，调节屏幕，调节投影仪，调节功放，然后才是开DVD.<br />     
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />light.dim(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />screen.down();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />projector.on();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />projector.setInput(dvd);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />amp.on();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />amp.setVolume(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dvd.on();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dvd.playMovie();</span></div><br />    这其实是一个比较普通的完整需求，这确涉及到五六个类，如果直接给这样的接口给client，十分不方便，我们应该根据需求，把细节包装起来，直接提供一个showMovie（包装以上实现）的方法给客户端。<br /><br /><strong>  The Facade Pattern</strong> provides a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. <br /><br />  when:<br /> 1.为一个复杂子系统提供一个简单接口<br />   （1:用一个方法包装不同类的多个方法。2:把一个逻辑模块类接口集中到一个类）<br /> 2.子系统的独立性，将一个子系统与它的客户端以及其它子系统分开，可提高子系统的独立性和可移植性<br /> 3.  层次化结构，简化层与层直接的依赖关系。<img src ="http://www.blogjava.net/zhoumin007/aggbug/38221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-30 11:56 <a href="http://www.blogjava.net/zhoumin007/articles/38221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter</title><link>http://www.blogjava.net/zhoumin007/articles/38216.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Thu, 30 Mar 2006 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/38216.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/38216.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/38216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/38216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/38216.html</trackback:ping><description><![CDATA[一：<br />     现实生活例子：插座是三相的如果电器插头是两相的，那么需要一个adapter把三相的插座转成两相。<br />     
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Enumeration到Iterator的Adapter</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_84_418_Open_Image" onclick="this.style.display='none'; Codehighlighter1_84_418_Open_Text.style.display='none'; Codehighlighter1_84_418_Closed_Image.style.display='inline'; Codehighlighter1_84_418_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_84_418_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_84_418_Closed_Text.style.display='none'; Codehighlighter1_84_418_Open_Image.style.display='inline'; Codehighlighter1_84_418_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> EnumerationIterator </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> Iterator </span><span id="Codehighlighter1_84_418_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_84_418_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Enumeration enumeration;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> EnumerationIterator(Enumeration enumeration)<br /><img id="Codehighlighter1_174_209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_174_209_Open_Text.style.display='none'; Codehighlighter1_174_209_Closed_Image.style.display='inline'; Codehighlighter1_174_209_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_174_209_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_174_209_Closed_Text.style.display='none'; Codehighlighter1_174_209_Open_Image.style.display='inline'; Codehighlighter1_174_209_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_174_209_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_174_209_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enumeration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">enumeration;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_237_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_237_280_Open_Text.style.display='none'; Codehighlighter1_237_280_Closed_Image.style.display='inline'; Codehighlighter1_237_280_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_237_280_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_237_280_Closed_Text.style.display='none'; Codehighlighter1_237_280_Open_Image.style.display='inline'; Codehighlighter1_237_280_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> hasNext() </span><span id="Codehighlighter1_237_280_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_237_280_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> enumeration.hasMoreElements();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_305_344_Open_Image" onclick="this.style.display='none'; Codehighlighter1_305_344_Open_Text.style.display='none'; Codehighlighter1_305_344_Closed_Image.style.display='inline'; Codehighlighter1_305_344_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_305_344_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_305_344_Closed_Text.style.display='none'; Codehighlighter1_305_344_Open_Image.style.display='inline'; Codehighlighter1_305_344_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object next() </span><span id="Codehighlighter1_305_344_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_305_344_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> enumeration.nextElement();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_368_416_Open_Image" onclick="this.style.display='none'; Codehighlighter1_368_416_Open_Text.style.display='none'; Codehighlighter1_368_416_Closed_Image.style.display='inline'; Codehighlighter1_368_416_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_368_416_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_368_416_Closed_Text.style.display='none'; Codehighlighter1_368_416_Open_Image.style.display='inline'; Codehighlighter1_368_416_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> remove() </span><span id="Codehighlighter1_368_416_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_368_416_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> UnsupportedOperationException();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_1_18_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1_18_Open_Text.style.display='none'; Codehighlighter1_1_18_Closed_Image.style.display='inline'; Codehighlighter1_1_18_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1_18_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1_18_Closed_Text.style.display='none'; Codehighlighter1_1_18_Open_Image.style.display='inline'; Codehighlighter1_1_18_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">    </span><span id="Codehighlighter1_1_18_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_1_18_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * 客户端代码<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_60_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_277_Open_Text.style.display='none'; Codehighlighter1_60_277_Closed_Image.style.display='inline'; Codehighlighter1_60_277_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_60_277_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_277_Closed_Text.style.display='none'; Codehighlighter1_60_277_Open_Image.style.display='inline'; Codehighlighter1_60_277_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_60_277_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_60_277_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Vector vect</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Vector();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        vect.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">v1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        vect.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">v2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        display(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EnumerationIterator(vect.elements()));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        List list1</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        list1.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">L1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        list1.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">L2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        display(list1.iterator());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> display(Iterator iter)<br /><img id="Codehighlighter1_323_395_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_395_Open_Text.style.display='none'; Codehighlighter1_323_395_Closed_Image.style.display='inline'; Codehighlighter1_323_395_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_323_395_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_323_395_Closed_Text.style.display='none'; Codehighlighter1_323_395_Open_Image.style.display='inline'; Codehighlighter1_323_395_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_323_395_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_323_395_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (iter.hasNext())<br /><img id="Codehighlighter1_352_392_Open_Image" onclick="this.style.display='none'; Codehighlighter1_352_392_Open_Text.style.display='none'; Codehighlighter1_352_392_Closed_Image.style.display='inline'; Codehighlighter1_352_392_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_352_392_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_352_392_Closed_Text.style.display='none'; Codehighlighter1_352_392_Open_Image.style.display='inline'; Codehighlighter1_352_392_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_352_392_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_352_392_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(iter.next());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div><br />     <strong>The Adapter Pattern</strong> converts the interface of  a class into another interface the client expect.Adapter lets classes work together that couldn't otherwise because of  incompatible interfaces.<br />   和Decorator模式不同，decorator对类包装后是增加它的功能，而Adapter是改变接口形式以适用client需要<br />    <br />   应用实例：WINE在Linux环境下运行Windows程序。<br />                       JDBC/ODBC桥。<img src ="http://www.blogjava.net/zhoumin007/aggbug/38216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-30 11:29 <a href="http://www.blogjava.net/zhoumin007/articles/38216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Factory</title><link>http://www.blogjava.net/zhoumin007/articles/37829.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Tue, 28 Mar 2006 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/37829.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/37829.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/37829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/37829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/37829.html</trackback:ping><description><![CDATA[
		<p>一：case context:<br />    一个Pizza管理系统  </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_37_263_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_263_Open_Text.style.display='none'; Codehighlighter1_37_263_Closed_Image.style.display='inline'; Codehighlighter1_37_263_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_37_263_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_37_263_Closed_Text.style.display='none'; Codehighlighter1_37_263_Open_Image.style.display='inline'; Codehighlighter1_37_263_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> Pizza orderPizza(String type)</span>
				<span id="Codehighlighter1_37_263_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
				</span>
				<span id="Codehighlighter1_37_263_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         Pizza pizza;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
						<font color="#ff0000">
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (type.equals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">cheese</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) pizza</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
						</font>
						<font color="#ff0000">
								<span style="COLOR: #000000"> CheesePizza();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (type.euals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">veggie</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) pizza</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
						</font>
						<font color="#ff0000">
						</font>
						<span style="COLOR: #000000">
								<font color="#ff0000"> VeggiePizza();<br /></font>
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         pizza.bake();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         pizza.box();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> pizza();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />      }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>         问题：红色字体部分可能会modification(增加新的或删除旧的)，所以必须把这部分包装起来成一个独立的类。<br /><br />二：SimpleFactory模式      </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_33_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_288_Open_Text.style.display='none'; Codehighlighter1_33_288_Closed_Image.style.display='inline'; Codehighlighter1_33_288_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_33_288_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_288_Closed_Text.style.display='none'; Codehighlighter1_33_288_Open_Image.style.display='inline'; Codehighlighter1_33_288_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SimplePizzaFactory</span>
				<span id="Codehighlighter1_33_288_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
				</span>
				<span id="Codehighlighter1_33_288_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_79_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_79_281_Open_Text.style.display='none'; Codehighlighter1_79_281_Closed_Image.style.display='inline'; Codehighlighter1_79_281_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_79_281_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_281_Closed_Text.style.display='none'; Codehighlighter1_79_281_Open_Image.style.display='inline'; Codehighlighter1_79_281_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        pubic Pizza createPizza(String type)</span>
						<span id="Codehighlighter1_79_281_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						</span>
						<span id="Codehighlighter1_79_281_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              Pizza pizza;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (type.equals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">cheese</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) pizza</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> CheesePizza();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (type.euals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">veggie</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) pizza</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> VeggiePizza();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> pizza;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />         }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>    优点：因为是一个独立的类，所以可以共享，一处修改即可，不需修改客户端。<br />    缺点：对"close-opening"原则支持不够，如有新产品加入还是要改Factory中的代码。<br />    实例：DateFormat类：              </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000"> Date date</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">DateFormat.getDateInstance(DateFormat.DEFAULT,Locale.FRENCH);<br /></span>
		</div>
		<p>
				<br />三：Factory Method模式<br />        当构建对象部分需求发生变化，如现在pizza分为美国和意大利两种口味。<br />        解决办法：1:一个抽象创建基类，abstract Product create();<br />                            2:具体类来实现create方法<br />                            3:抽象产品基类。<br />                            4:具体产品类。<br />  </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">具体工厂实现</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_57_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_264_Open_Text.style.display='none'; Codehighlighter1_57_264_Closed_Image.style.display='inline'; Codehighlighter1_57_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_57_264_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_264_Closed_Text.style.display='none'; Codehighlighter1_57_264_Open_Image.style.display='inline'; Codehighlighter1_57_264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> UsPizzaFactory </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> PizzaFactory</span>
				<span id="Codehighlighter1_57_264_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_57_264_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_98_262_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_262_Open_Text.style.display='none'; Codehighlighter1_98_262_Closed_Image.style.display='inline'; Codehighlighter1_98_262_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_98_262_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_262_Closed_Text.style.display='none'; Codehighlighter1_98_262_Open_Image.style.display='inline'; Codehighlighter1_98_262_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> Pizza createPizza(String type)</span>
						<span id="Codehighlighter1_98_262_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_98_262_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     Pizza pizza;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (type.equals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">cheese</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) pizza</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> UsCheesePizza();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (type.equals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">veggie</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) pizza</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> UsVeggiePizza();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> pizza;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>
				<strong>The Factory Method Pattern</strong> defines an interface for creation an object,but let subclasses decide which class to  instantiate.Factory Method lets a class defer instantiation to subclasses.<br /><br />四：Abstract Factory<br />     抽象工厂模式和工厂方法模式的主要区别是，工厂方法模式针对的是一个产品等级结构，而抽象工厂方法对应多个产品等级结构。<br />      <img src="http://www.flickr.com/photos/46181808@N00/119735162/" /><br />  实例：创建分属不同操作系统的视窗构件。<br />           </p>
<img src ="http://www.blogjava.net/zhoumin007/aggbug/37829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-28 16:28 <a href="http://www.blogjava.net/zhoumin007/articles/37829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Decorator</title><link>http://www.blogjava.net/zhoumin007/articles/37718.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Tue, 28 Mar 2006 00:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/37718.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/37718.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/37718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/37718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/37718.html</trackback:ping><description><![CDATA[一：case context：咖啡店产品管理系统<br />        饮料基类abstract Beverage{cost();}, 两种饮料子类HouseBlend，Decaf都实现了cost()方法。每种饮料有自己的价钱，如果加牛奶糖等condiments按份算钱。<br /><br />二：目前实现：<br />      基类增加milk，sweet等属性，增加hasMilk，hasSweet等方法，cost()实现时根据hasMilk()等判断计算。<br />      问题：1：condiments价格变化必须改变已有代码。<br />                  2：增加新的condiments必须修改基类。<br />                  3：把所有condiments都作为基类的属性不合适，因为不是每个子类必须的，比如某些可能不适合Tea等饮料。<br />                  4：如果顾客需要多份condiments没办法计算。<br /><br />三：<br />     <strong>Design principal(open-close principal):</strong> Classes should be open for extension,but close for modification.<br />     <strong>The Decorator pattern</strong> :attaches additional responsibilities to a object dynamically.Decorator provide a flexible alternative to subclassing for extending functionality.<br />      现实方法：<br />      public abstract CondimentDecorator <font color="#ff6600">extends Beverage</font>{}<br />     <br />     public Mocha extends CondifmentDecorator{<br />         private Beverage beverage;<br />         public Mocha(Beverage  beverage){<br />             this.beverage=beverage;<br />         }<br />        public float cost(){<br />           return beverage.cost()+0.9;<br />        }<br />       public String getDescription(){<br />          reuturn beverage.getDescription+" Mocha";<br />       }<br />    }<br />   //--client test<br />    Beverage beverage=new HouseBlend();<br />    beverage=new Mocha(beverage);<br />    beverage=new Mocha(beverage);<br />    beverage=new Milk(beverage);<br />    System.out.println(beverage.getDescription()+beverage.cost());<br />     说明：<br />    1:decorators继承被包装的类的基类，不是为了代码重用，而是为了有一个相同的基类，这样包装一次之后其基类还是被包装类的基类，所以可以继续包装。<br />    2:decorator有一个被包装类属性，这样decorator在被包装类取得信息后在做处理。<br /><br />四：when<br />     1:当需要扩展一个类的功能，或给一个类增加新的behavior；<br />     2:需要动态给一个对象增加功能，这些功能可以再动态的撤销。<br />     3:需要增加有一些基本功能的排列组合而产生的非常大量的功能，从而使继承关系变得不现实。<br /><br />五：现实使用<br />     1:java I/O 类：abstract component－》InputStream，abstract decorator－》FilterInputStream,<br />                             decorator－》BufferInputStream，LineNumberInputStream<br />     2:文本过滤系统<br />     <img src ="http://www.blogjava.net/zhoumin007/aggbug/37718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-28 08:26 <a href="http://www.blogjava.net/zhoumin007/articles/37718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Observer</title><link>http://www.blogjava.net/zhoumin007/articles/37670.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Mon, 27 Mar 2006 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/37670.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/37670.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/37670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/37670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/37670.html</trackback:ping><description><![CDATA[
		<p>一：case context：<br />     有一个气象信息类WeatherData，属性包括temperature，humidity等，现有两种显示WeatherData数据的类WeatherDataDisplay1和WeatherDataDisplay2，当WeatherData的信息改变时，这两个显示的类中的数据也改变，维护性方面，可能会有第三种显示方法，某个显示类可以申请不根据WeatherData数据实时改变。<br /><br />二：<br />    目前现方法， WeatherData中 <br />     public void measurementsChanged()<br />    {<br />         display1.update(getTemperature(),getHumidity());<br />         display2.update(getTemperature(),getHumidity());<br />    } <br />    但方法体中的代码是可能会变的，有display3的时候，必须得修改代码。<br />三：<br />     <strong>The Observer pattern</strong>：defines a one-to-many dependency between objects so that when one object changes state,<br />                                           all of its dependents are notified and updated automatically.<br /><br />    此模式类包括:  Subject 接口{registerObserver();removeObserver(),notifyObservers()}, Concrete Subject 类<br />                               Observer接口{update();},  多个ConcreteObserver类(display1,display2)。<br />    public class WeatherData implements Subject<br />    {<br />           private  List observerList;<br />           private float temperature;<br />           private float humidity;<br /><br />          public void registerObserver(Observer observer)<br />          {<br />                 observerList.add(observer);<br />          }<br />          public void notifyObjects()<br />        {<br />           for (Iterator iter=objectList.iterator();iter.hasNext();)<br />         {<br />           Observer observer=(Observer)iter.next();<br />            observer.update();<br />          }<br />        }<br />        public void changeData(float newTemperature)<br />        {<br />              this.temperature=newTemperature;<br />              notifyObjects();<br />        }<br />    }<br />   //<br />    public class WeatherReport1 implements Observer{<br />      private WeatherData weatherData;<br />      public WeatherReport1(WeatherData weatherData)<br />     {<br />        this.weatherData=weatherData;<br />        weatherData.registerObject(this);<br />    }<br />    public void update() <br />    {<br />     System.out.println("report1--now temperature is:"+weatherData.getTemperature());<br />    }<br />  }<br /> //客户端测试代码<br /> public class Tester {<br /> public static void main(String[] args) {<br />  WeatherData weatherData=new WeatherData();<br />  WeatherReport1 weatherReport1=new WeatherReport1(weatherData);<br />  WeatherReport2 weatherReport2=new WeatherReport2(weatherData);<br />  weatherData.changeData(10);<br />  weatherData.removeObject(weatherReport1);<br />  weatherData.changeData(20);<br /> }<br />}<br />四：java语言build-in支持<br />       在java.util.包中<br />     Subject接口--&gt;Observable 类（把Observer注册，notify等方法实现）<br />     Observer接口--&gt;Observer接口<br />     缺点：Observable是一个类你必须继承它，如果还要继承其它类就不行了。<br />     所以如果java内建的类不适合你，就按我们上面写的自己重头写一个。<br /><br />五：实例<br />     1: swing中的事件处理：<br />          button.addActionListener(new AL1);<br />          button.addActionListerner(new AL2);<br />          public void AL1 implements ActionListener{<br />                  public void actionPerformed(Event e)<br />                  {//---<br />                  }<br />         }<br /><br />      2:应用系统中，订阅信息：<br />         如有多个用户订阅的跟踪某记录更新信息。</p>
<img src ="http://www.blogjava.net/zhoumin007/aggbug/37670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-27 19:17 <a href="http://www.blogjava.net/zhoumin007/articles/37670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strategy</title><link>http://www.blogjava.net/zhoumin007/articles/37629.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Mon, 27 Mar 2006 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/37629.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/37629.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/37629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/37629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/37629.html</trackback:ping><description><![CDATA[1:case context:<br /> 现设计一个关于鸭子的系统，一个抽象类Duck，方法为quack(),swim(),abstract display()(具体子   类实现)。现需求为有部分类型的鸭子可以fly(),如何实现。<br />   a:继承：把fly()提到Duck类中，可实现代码复用。<br />                 问题：违反继承原则，父类的方法必须是所有子类都具有的行为，代码维护 时如加入一  种新类 型木头鸭就没有fly()行为。<br /><br />  b:接口：写一个flyable接口，所有有fly()行为的鸭子都实现这个接口。<br />                问题：不能实现代码复用。<br />   <br />2: 重新分析：<br />    fly()行为不是每个子类都有，fly()的具体实现可能会变化（有的是用翅膀飞行，有的是滑行， 或是其它没有发现的方法，总之它是会变的（change，add））。<br />   <strong> Design Principal</strong>：Identify the aspects of your application that vary and seperate them from what stays the same。<br />    （take the parts that vary and encapsulate them,so that later you can alter and extend the parts that vary without affecting those don't ）<br />   解决方法：<br />          写FlyBehavior接口，和两个实现类FlyWithWings和FlyNoWay，这样把Fly的行为从duck类的内部提了出来，我们可以修改和增加行为而不影响其它代码。<br />          把FlyBehavior实例作为Duck的属性，子类构造时可以通过new FlyBehavior的实现类设置此属性，（因为FlyBehavior是接口，我们可以在Runtime 改变它），然后在Duck写performFly()实现方法为代理flyBehavior.fly()。<br />    <strong>Design Principal</strong>：Favor composition than inheirtance.<br />    (1:change behavior at runtime.2:encapsulate a family of algorithms into their own classes)<br /><br />  <strong> Strategy pattern:</strong> define a family of algorithms,encapsulates each one,and make them interchangeable. Strategy lets the algorithm vary independently from the client that use it.<br /><br />3:现实应用：<br />   图书打折计算：有多种打折策略，折扣可能会变动或增加。<br />   排序系统：先写出各种排序实现，根据情况动态选择排序策略。  <img src ="http://www.blogjava.net/zhoumin007/aggbug/37629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-27 16:24 <a href="http://www.blogjava.net/zhoumin007/articles/37629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式介绍</title><link>http://www.blogjava.net/zhoumin007/articles/37516.html</link><dc:creator>zhoumin</dc:creator><author>zhoumin</author><pubDate>Sun, 26 Mar 2006 15:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhoumin007/articles/37516.html</guid><wfw:comment>http://www.blogjava.net/zhoumin007/comments/37516.html</wfw:comment><comments>http://www.blogjava.net/zhoumin007/articles/37516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoumin007/comments/commentRss/37516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoumin007/services/trackbacks/37516.html</trackback:ping><description><![CDATA[what（define）？设计模式是对重复出现的类似问题的经典解决方法。<br />why?经典优雅解决方式，不需自己再去走弯路。<br />when？先要熟悉基本的模式，熟练时就知道什么时候该用，什么时候不该用。<br />where?软件开发（面向对象语言），特别是底层系统框架开发。<br />how（to study it）？<br />                         学习case<br />                              1:需求（功能，可维护性，可扩展性）<br />                              2:解决方法<br />                        实际应用：生活例子，java类库，java系统<br /><br />参考资料：《head first design pattern》<br />                     《java 与 模式》<br />                      jive 研究<img src ="http://www.blogjava.net/zhoumin007/aggbug/37516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoumin007/" target="_blank">zhoumin</a> 2006-03-26 23:51 <a href="http://www.blogjava.net/zhoumin007/articles/37516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>