﻿<?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-DANCE WITH JAVA-随笔分类-设计模式</title><link>http://www.blogjava.net/dreamstone/category/24599.html</link><description>开发出高质量的系统</description><language>zh-cn</language><lastBuildDate>Mon, 20 Aug 2007 03:41:36 GMT</lastBuildDate><pubDate>Mon, 20 Aug 2007 03:41:36 GMT</pubDate><ttl>60</ttl><item><title>终于可以在Java中使用lazy loading的单态了</title><link>http://www.blogjava.net/dreamstone/archive/2007/02/27/101000.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Tue, 27 Feb 2007 12:10:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/02/27/101000.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/101000.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/02/27/101000.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/101000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/101000.html</trackback:ping><description><![CDATA[<p><a href="http://www.blogjava.net/dreamstone/archive/2006/11/04/79026.html">在我的这篇文章http://www.blogjava.net/dreamstone/archive/2006/11/04/79026.html中写了为什么不要使用Java的lazy loading</a> ,即使是double-check也解决不了问题，但是有人解决了这个问题。<br>佩服啊。实在是巧妙，如此简单<br>注意：在多个虚拟机的情况下这个方法还是不能用的，但是一般情况下是可以的。<br>实现方式：<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 id=Codehighlighter1_23_224_Open_Image onclick="this.style.display='none'; Codehighlighter1_23_224_Open_Text.style.display='none'; Codehighlighter1_23_224_Closed_Image.style.display='inline'; Codehighlighter1_23_224_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_23_224_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_224_Closed_Text.style.display='none'; Codehighlighter1_23_224_Open_Image.style.display='inline'; Codehighlighter1_23_224_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">&nbsp;</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;Singleton&nbsp;</span> <span id=Codehighlighter1_23_224_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_224_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img id=Codehighlighter1_62_121_Open_Image onclick="this.style.display='none'; Codehighlighter1_62_121_Open_Text.style.display='none'; Codehighlighter1_62_121_Closed_Image.style.display='inline'; Codehighlighter1_62_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_62_121_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_121_Closed_Text.style.display='none'; Codehighlighter1_62_121_Open_Image.style.display='inline'; Codehighlighter1_62_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;SingletonHolder&nbsp;</span> <span id=Codehighlighter1_62_121_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_62_121_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;Singleton&nbsp;instance&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;Singleton();&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img id=Codehighlighter1_169_216_Open_Image onclick="this.style.display='none'; Codehighlighter1_169_216_Open_Text.style.display='none'; Codehighlighter1_169_216_Closed_Image.style.display='inline'; Codehighlighter1_169_216_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_169_216_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_169_216_Closed_Text.style.display='none'; Codehighlighter1_169_216_Open_Image.style.display='inline'; Codehighlighter1_169_216_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;Singleton&nbsp;getInstance()&nbsp;</span> <span id=Codehighlighter1_169_216_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_169_216_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;SingletonHolder.instance;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> </div>
<p>这个写法的发明者是Google公司的Bob lee。<br>他还写了个轻量级IoC容器，据说不要配制文件，性能比spring快100倍。感觉100倍有些夸张，不过可以看看。<br><br></p>
<img src ="http://www.blogjava.net/dreamstone/aggbug/101000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-02-27 20:10 <a href="http://www.blogjava.net/dreamstone/archive/2007/02/27/101000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐给大家一个很有趣的话题： Javaeye上的"奇技淫巧"</title><link>http://www.blogjava.net/dreamstone/archive/2007/02/27/100950.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Tue, 27 Feb 2007 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/02/27/100950.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/100950.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/02/27/100950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/100950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/100950.html</trackback:ping><description><![CDATA[从javaeye上看到一篇很有趣的文章&lt;&lt;奇技淫巧&gt;&gt;，链接在这里<br><a href="http://www.javaeye.com/topic/39694?page=1">http://www.javaeye.com/topic/39694?page=1</a><br>文中就一个问题提出了各种各样的思路，很多人给出了自己的观点，是个对人有启发的话题。<br>下边是我想出的一个思路，就是利用jdk1.6的script支持，也算一个办法吧。建议看完了上边的讨论再看<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_55_466_Open_Image onclick="this.style.display='none'; Codehighlighter1_55_466_Open_Text.style.display='none'; Codehighlighter1_55_466_Closed_Image.style.display='inline'; Codehighlighter1_55_466_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_55_466_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_466_Closed_Text.style.display='none'; Codehighlighter1_55_466_Open_Image.style.display='inline'; Codehighlighter1_55_466_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;getOverall(Details[]&nbsp;arr&nbsp;,String&nbsp;method)</span><span id=Codehighlighter1_55_466_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_55_466_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;sum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_80_402_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_402_Open_Text.style.display='none'; Codehighlighter1_80_402_Closed_Image.style.display='inline'; Codehighlighter1_80_402_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_80_402_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_402_Closed_Text.style.display='none'; Codehighlighter1_80_402_Open_Image.style.display='inline'; Codehighlighter1_80_402_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span id=Codehighlighter1_80_402_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_80_402_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptEngineManager&nbsp;factory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ScriptEngineManager();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptEngine&nbsp;engine&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;factory.getEngineByName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">JavaScript</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img id=Codehighlighter1_238_398_Open_Image onclick="this.style.display='none'; Codehighlighter1_238_398_Open_Text.style.display='none'; Codehighlighter1_238_398_Closed_Image.style.display='inline'; Codehighlighter1_238_398_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_238_398_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_238_398_Closed_Text.style.display='none'; Codehighlighter1_238_398_Open_Image.style.display='inline'; Codehighlighter1_238_398_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">arr.length;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_238_398_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_238_398_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">obj</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arr[i]);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;engine.eval(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">obj.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">method);<br><img id=Codehighlighter1_346_393_Open_Image onclick="this.style.display='none'; Codehighlighter1_346_393_Open_Text.style.display='none'; Codehighlighter1_346_393_Closed_Image.style.display='inline'; Codehighlighter1_346_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_346_393_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_346_393_Closed_Text.style.display='none'; Codehighlighter1_346_393_Open_Image.style.display='inline'; Codehighlighter1_346_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(obj&nbsp;</span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000">&nbsp;Double)</span><span id=Codehighlighter1_346_393_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_346_393_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;((Double)obj).doubleValue();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_421_449_Open_Image onclick="this.style.display='none'; Codehighlighter1_421_449_Open_Text.style.display='none'; Codehighlighter1_421_449_Closed_Image.style.display='inline'; Codehighlighter1_421_449_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_421_449_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_421_449_Closed_Text.style.display='none'; Codehighlighter1_421_449_Open_Image.style.display='inline'; Codehighlighter1_421_449_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Exception&nbsp;e)</span><span id=Codehighlighter1_421_449_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_421_449_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;sum;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_518_562_Open_Image onclick="this.style.display='none'; Codehighlighter1_518_562_Open_Text.style.display='none'; Codehighlighter1_518_562_Closed_Image.style.display='inline'; Codehighlighter1_518_562_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_518_562_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_518_562_Closed_Text.style.display='none'; Codehighlighter1_518_562_Open_Image.style.display='inline'; Codehighlighter1_518_562_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;getOverallBalance(Details[]&nbsp;arr)&nbsp;</span><span id=Codehighlighter1_518_562_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_518_562_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;getOverall(arr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">getBalance()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_611_653_Open_Image onclick="this.style.display='none'; Codehighlighter1_611_653_Open_Text.style.display='none'; Codehighlighter1_611_653_Closed_Image.style.display='inline'; Codehighlighter1_611_653_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_611_653_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_611_653_Closed_Text.style.display='none'; Codehighlighter1_611_653_Open_Image.style.display='inline'; Codehighlighter1_611_653_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;getOverallFixed(Details[]&nbsp;arr)&nbsp;</span><span id=Codehighlighter1_611_653_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_611_653_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;getOverall(arr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">getFixed()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">..&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
最终的实现就是上边的样子，利用script我们能实现通过函数名来调用函数，其实内部和动态代理，反射<br>&nbsp;的效果是一样的。不过就是写起来简单，学习成本低。因为用java的人大部分是了解javascript的。 
<img src ="http://www.blogjava.net/dreamstone/aggbug/100950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-02-27 16:34 <a href="http://www.blogjava.net/dreamstone/archive/2007/02/27/100950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式相关文章 -- 目录</title><link>http://www.blogjava.net/dreamstone/archive/2007/01/08/92491.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Mon, 08 Jan 2007 15:42:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/01/08/92491.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/92491.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/01/08/92491.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/92491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/92491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式&nbsp;&nbsp;<a href='http://www.blogjava.net/dreamstone/archive/2007/01/08/92491.html'>阅读全文</a><img src ="http://www.blogjava.net/dreamstone/aggbug/92491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-01-08 23:42 <a href="http://www.blogjava.net/dreamstone/archive/2007/01/08/92491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更详细的 Bridge Adapter Facade模式之间的比较</title><link>http://www.blogjava.net/dreamstone/archive/2007/01/08/92482.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Mon, 08 Jan 2007 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/01/08/92482.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/92482.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/01/08/92482.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/92482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/92482.html</trackback:ping><description><![CDATA[<a href="http://www.blogjava.net/dreamstone/archive/2007/01/07/92268.html">在这篇文章中</a>，我写了Bridge和adapter模式的区别.但是 maninred说<br>Bridge和adapter是没有关系的，而和Facade比较象，但在我的经验中更多的时候<br>是会混淆Bridge和adapter而不是Facade，这里详细的列出三个模式的比较 .<br>一,定义:<br>1.Facade模式是为一个复杂系统提供一个简单的接口。<br>比如你要去博物馆参观，很多东西，你一个个到处去问每个东西的管理员很麻烦，所以你找一个导游，让他给你一个个介绍，你只要找到导游就好了。导游就是门面。<br>2，适配器模式，引用一下GOF95中的话:<br>适配器模式是把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口不匹配而无法工作的两个类能够工作到一起。<br>举个例子，例如变压器<br>3，Bridge模式:<br>GOF95中的桥梁模式的描述：桥梁模式的用意是"将抽象化与实现化脱耦，使的二者可以独立变化。<br>例如AWT的实现<br>二,目的:<br>1,Facade模式使用在给一个复杂的系统提供统一的门面(接口),目的是简化客户端的操作,但并没有改变接口.<br>2,Adapter模式使用在两个部分有不同的接口的情况,目的是改变接口,使两个部分协同工作<br>3,桥梁模式是为了分离抽象和实现<br>二,使用场合<br>1,Facade模式出现较多的情况是这样的情况,你有一个复杂的系统,对应了各种情况,<br>客户看了说功能不错,但是使用太麻烦.你说没问题,我给你提供一个统一的门面.<br>所以Facade使用的场合多是对系统的"优化".<br>2,Adapter模式出现的情况是这样,你有一个类提供接口A,但是你的客户需要一个实现接口B的类,<br>这个时候你可以写一个Adapter让把A接口变成B接口,所以Adapter使用的场合是<br>指鹿为马.就是你受夹板气的时候,一边告诉你我只能提供给你A(鹿),一边告诉你说<br>我只要B(马),他长了四条腿,你没办法了,把鹿牵过去说,这是马,你看他有四条腿.<br>(当然实现指鹿为马也有两种方法,一个方法是你只露出鹿的四条腿,说你看这是马,这种方式就是<br>封装方式的Adapter实现,另一种方式是你把鹿牵过去,但是首先介绍给他说这是马,因为他长了四条腿<br>这种是继承的方式.)<br>3,Bridge模式在一般的开发中出现的情况并不多,AWT是一个,SWT也算部分是,<br>如果你的客户要求你开发一个系统,这个系统在Windows下运行界面的样子是Windows的样子.<br>在Linux下运行是Linux下的样子.在Macintosh下运行要是Mac Os的样子.<br>怎么办? 定义一系列的控件Button,Text,radio,checkBox等等.供上层开发者<br>使用,他们使用这些控件的方法,利用这些控件构造一个系统的GUI,然后你为这些控件<br>写好Linux的实现,让它在Linux上调用Linux本地的对应控件,<br>在Windows上调用Windows本地的对应控件,在Macintosh上调用Macintosh本地的对应控件<br>ok,你的任务完成了.<br>三,需求程度<br>1,Facade的需求程度是"中等",因为你不提供Facade程序照样能工作,只是不够好.<br>2,Adapter的需求程度是"必须",因为你不这么做就不能工作,除非你自己从头实现一个.<br>3,Bridge的需求程度是"一般",适合精益求精的人,因为你可以写三个程序给客户.<br>四,出现时期<br>1,Facade出现在项目中期,再优化<br>2,Adapter出现在项目后期,大部分都有了,差的仅仅是接口不同<br>3,Bridge出现在项目前期,你想让你的系统更灵活,更cool<br>五,在写文章的时候想到的<br>1,Facade很多时候是1:m的关系<br>2,Adapter很多是候是1:1的关系<br>3,Bridge很多时候是m:n的关系<br>呵呵.<br>六,最后<br>另外:回应一下maninred<br>1,我并没有把模式看的很独立,其实很多模式是配合使用的,而且在一定情况下可以<br>用一个替换另一个.同一个需求,有可能当你思考的角度不同时,使用的模式就不同了.<br>2,设计模式并不是"用OO的封装来封装所有的东西",模式其实可以应用于所有的设计上<br>和OO没有直接的关系,只是因为计算机的设计模式大部分是GOF收集总结的,<br>他们讲解设计模式是用的C++,而在Java中得到了大量应用,所以我们谈到设计模式<br>的时候多提到OO.其实模式更早应用于建筑学,Alexander的《建筑的永恒之道》讲的<br>就是设计模式。所以说设计模式应该是设计过程中积累下来的一些成型的东西。<br>更深入一点，《Java与模式》的作者认为模式起源于中国的道教思想，讲的是哲学。呵呵。<br>3，对于模式的使用，个人感觉，模式很大程度上是为了对应这类需求的所有情况，也就<br>是最复杂情况，最灵活情况，当我们实际的开发中并没有遇到这么多这样的情况。<br>所以在需要的时候使用，根据需求简化使用，而不是照搬。<br>4,虽然模式是相关的，但是只有知道了每个模式的区别点，才能更好的根据需求选择使用哪个模式。 
<img src ="http://www.blogjava.net/dreamstone/aggbug/92482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-01-08 23:21 <a href="http://www.blogjava.net/dreamstone/archive/2007/01/08/92482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>桥接模式和适配器模式的区别</title><link>http://www.blogjava.net/dreamstone/archive/2007/01/07/92268.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sun, 07 Jan 2007 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/01/07/92268.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/92268.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/01/07/92268.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/92268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/92268.html</trackback:ping><description><![CDATA[很多时候经常容易把桥接模式和适配器模式弄混。那什么时候用桥接，什么时候用适配器呢 ？<br><br>共同点：桥接和适配器都是让两个东西配合工作<br>不同点：出发点不同。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;适配器：改变已有的两个接口，让他们相容。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;桥接模式：分离抽象化和实现，使两者的接口可以不同，目的是分离。<br><br>所以说，如果你拿到两个已有模块，想让他们同时工作，那么你使用的适配器。<br>如果你还什么都没有，但是想分开实现，那么桥接是一个选择。<br><br>桥接是先有桥，才有两端的东西<br>适配是先有两边的东西，才有适配器<br><br>桥接是在桥好了之后，两边的东西还可以变化。<br><br>例如游戏手柄，就象个桥，它把你的任何操作转化成指令。<br>（虽然，你可以任何操作组合，但是你的操作脱不开山下左右，a,b，选择 ，确定）<br>JRE本身就是一个就是一个很好的桥，先写好在linux上执行的Jre，再写好可以在windows下执行的JRE，<br>这样无论什么样的Java程序，只要配和相应的Jre就能在Linux或者Windows上运行.<br>两个Jre并没有限定你写什么样的程序，但要求你必须用Java来写。 
<img src ="http://www.blogjava.net/dreamstone/aggbug/92268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-01-07 21:53 <a href="http://www.blogjava.net/dreamstone/archive/2007/01/07/92268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java与模式 --- 适配器模式</title><link>http://www.blogjava.net/dreamstone/archive/2007/01/07/92229.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sun, 07 Jan 2007 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/01/07/92229.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/92229.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/01/07/92229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/92229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/92229.html</trackback:ping><description><![CDATA[适配器模式：<br>如果你有两个编译好的(无源代码)类，类A有某些功能，但是需要一个xml读取模块才能工作，<br>这个模块要实现这个接口:<br>public interface XmlReader{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public InputStream xmlReader();<br>}<br>你的另一个类B恰好有这个功能，但是B实现的是这个接口:<br>public interface ReaderXml{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public InputStream readerXml();<br>}<br>这个时候我们的做法是写个适配器<br>public class Adapter implements XmlReader extends B{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public InputStream xmlReader(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;return readerXml();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>这个就是适配器模式了。<br>适配器模式还有另外一种实现方式<br>public class Adapter implements XmlReader<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReaderXml b = new B();<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; public InputStream xmlReader(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return b.readerXml();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br>} 
<img src ="http://www.blogjava.net/dreamstone/aggbug/92229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-01-07 16:07 <a href="http://www.blogjava.net/dreamstone/archive/2007/01/07/92229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的模式 －－－ 构造者模式</title><link>http://www.blogjava.net/dreamstone/archive/2007/01/07/92222.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sun, 07 Jan 2007 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/01/07/92222.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/92222.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/01/07/92222.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/92222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/92222.html</trackback:ping><description><![CDATA[一，一般来说你要做一件复杂的事情的时候，把它分成多个小的部分来做是比较好的方法，<br>把每个小部分做完，然后结合成一个完整的事情。例如生产一辆汽车，你是一个个零件<br>生产完了，才组装成一辆辆汽车。这个就是建造模式的工作。<br>二，建造模式的角色<br>1、抽象建造者<br>2、具体构造者<br>3、导演者<br>4、产品角色<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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">抽象构造者:<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_28_171_Open_Image onclick="this.style.display='none'; Codehighlighter1_28_171_Open_Text.style.display='none'; Codehighlighter1_28_171_Closed_Image.style.display='inline'; Codehighlighter1_28_171_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_28_171_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_171_Closed_Text.style.display='none'; Codehighlighter1_28_171_Open_Image.style.display='inline'; Codehighlighter1_28_171_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span id=Codehighlighter1_28_171_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_28_171_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造零件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;buildPart1();<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造零件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;buildPart2();<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返还商品</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">&nbsp;Product&nbsp;retrieveResult();<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>具体构造者:<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_224_568_Open_Image onclick="this.style.display='none'; Codehighlighter1_224_568_Open_Text.style.display='none'; Codehighlighter1_224_568_Closed_Image.style.display='inline'; Codehighlighter1_224_568_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_224_568_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_224_568_Closed_Text.style.display='none'; Codehighlighter1_224_568_Open_Image.style.display='inline'; Codehighlighter1_224_568_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">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ConcreteBuilder&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Builder</span><span id=Codehighlighter1_224_568_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_224_568_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Product&nbsp;product&nbsp;;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id=Codehighlighter1_287_402_Open_Image onclick="this.style.display='none'; Codehighlighter1_287_402_Open_Text.style.display='none'; Codehighlighter1_287_402_Closed_Image.style.display='inline'; Codehighlighter1_287_402_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_287_402_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_287_402_Closed_Text.style.display='none'; Codehighlighter1_287_402_Open_Image.style.display='inline'; Codehighlighter1_287_402_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Product&nbsp;retrieveResult()</span><span id=Codehighlighter1_287_402_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_287_402_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Product();<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product.setPart1(buildPart1());<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product.setPart2(buildPart2());<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;product;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id=Codehighlighter1_431_484_Open_Image onclick="this.style.display='none'; Codehighlighter1_431_484_Open_Text.style.display='none'; Codehighlighter1_431_484_Closed_Image.style.display='inline'; Codehighlighter1_431_484_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_431_484_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_431_484_Closed_Text.style.display='none'; Codehighlighter1_431_484_Open_Image.style.display='inline'; Codehighlighter1_431_484_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;buildPart1()</span><span id=Codehighlighter1_431_484_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_431_484_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造part1</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;part1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;part1;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img id=Codehighlighter1_513_566_Open_Image onclick="this.style.display='none'; Codehighlighter1_513_566_Open_Text.style.display='none'; Codehighlighter1_513_566_Closed_Image.style.display='inline'; Codehighlighter1_513_566_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_513_566_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_513_566_Closed_Text.style.display='none'; Codehighlighter1_513_566_Open_Image.style.display='inline'; Codehighlighter1_513_566_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;buildPart2()</span><span id=Codehighlighter1_513_566_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_513_566_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造part2</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">28</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;part2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;part2;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img id=Codehighlighter1_590_746_Open_Image onclick="this.style.display='none'; Codehighlighter1_590_746_Open_Text.style.display='none'; Codehighlighter1_590_746_Closed_Image.style.display='inline'; Codehighlighter1_590_746_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_590_746_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_590_746_Closed_Text.style.display='none'; Codehighlighter1_590_746_Open_Image.style.display='inline'; Codehighlighter1_590_746_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">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Product</span><span id=Codehighlighter1_590_746_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_590_746_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;Part1;<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;Part2;<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img id=Codehighlighter1_657_682_Open_Image onclick="this.style.display='none'; Codehighlighter1_657_682_Open_Text.style.display='none'; Codehighlighter1_657_682_Closed_Image.style.display='inline'; Codehighlighter1_657_682_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_657_682_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_657_682_Closed_Text.style.display='none'; Codehighlighter1_657_682_Open_Image.style.display='inline'; Codehighlighter1_657_682_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setPart1(Object&nbsp;Part1)</span><span id=Codehighlighter1_657_682_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_657_682_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.part1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;part1;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id=Codehighlighter1_719_744_Open_Image onclick="this.style.display='none'; Codehighlighter1_719_744_Open_Text.style.display='none'; Codehighlighter1_719_744_Closed_Image.style.display='inline'; Codehighlighter1_719_744_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_719_744_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_719_744_Closed_Text.style.display='none'; Codehighlighter1_719_744_Open_Image.style.display='inline'; Codehighlighter1_719_744_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setPart2(Object&nbsp;Part2)</span><span id=Codehighlighter1_719_744_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_719_744_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.part2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;part2;<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">导演者</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #008000"><img id=Codehighlighter1_775_943_Open_Image onclick="this.style.display='none'; Codehighlighter1_775_943_Open_Text.style.display='none'; Codehighlighter1_775_943_Closed_Image.style.display='inline'; Codehighlighter1_775_943_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_775_943_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_775_943_Closed_Text.style.display='none'; Codehighlighter1_775_943_Open_Image.style.display='inline'; Codehighlighter1_775_943_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">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Director</span><span id=Codehighlighter1_775_943_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_775_943_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Builder&nbsp;builder;<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img id=Codehighlighter1_827_941_Open_Image onclick="this.style.display='none'; Codehighlighter1_827_941_Open_Text.style.display='none'; Codehighlighter1_827_941_Closed_Image.style.display='inline'; Codehighlighter1_827_941_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_827_941_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_827_941_Closed_Text.style.display='none'; Codehighlighter1_827_941_Open_Image.style.display='inline'; Codehighlighter1_827_941_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;construct()</span><span id=Codehighlighter1_827_941_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_827_941_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ConcreteBuilder();<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.retrieveResult();<br></span><span style="COLOR: #008080">58</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>
<img src ="http://www.blogjava.net/dreamstone/aggbug/92222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-01-07 15:19 <a href="http://www.blogjava.net/dreamstone/archive/2007/01/07/92222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>visitor模式概念-------------－-----   visitor模式进一步</title><link>http://www.blogjava.net/dreamstone/archive/2006/12/20/88948.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Tue, 19 Dec 2006 17:26:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2006/12/20/88948.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/88948.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2006/12/20/88948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/88948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/88948.html</trackback:ping><description><![CDATA[<p>visitor模式理论及学术概念-------------－-----&nbsp;&nbsp; visitor模式进一步<br>一，访问者模式的角色：<br>抽象访问者：声明一个或者多个访问操作，形成所有的具体元素都要实现的接口<br>具体访问者：实现抽象访问者所声明的接口<br>抽象节点：声明一个接受操作，接受一个访问者对象作为参量<br>具体节点：实现了抽象元素所规定的接受操作<br>结构对象：遍历结构中的所有元素，类似List Set等<br>二，在什么情况下应当使用访问者模式<br>访问者模式应该用在被访问类结构比较稳定的时候，换言之系统很少出现增加新节点的<br>情况。因为访问者模式对开－闭原则的支持并不好，访问者模式允许在节点中加入方法，<br>是倾斜的开闭原则，类似抽象工厂。<br>三，访问者模式的缺点：<br>1，增加节点困难<br>2，破坏了封装<br>因为访问者模式的缺点和复杂性，很多设计师反对使用访问者模式。个人感觉应该在了解的<br>情况下考虑衡量选择。</p>
<p>最后的部分： <br>看完本文，如果你对visitor模式有更多的兴趣，想了解更多请看如下几篇文章。<br>1,<a href="http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html"><font color=#7297ce>静态分派，动态分派，多分派，单分派 --------------&nbsp;&nbsp; visitor模式准备</font></a><br>2<a href="http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html"><font color=#7297ce>,访问差异类型的集合类 ------------------------&nbsp;&nbsp; visitor模式入门</font></a><br>3,visitor模式理论及学术概念-------------－-----&nbsp;&nbsp; visitor模式进一步<font color=#7297ce>(<font color=#000000>本文）</font></font><br>4，<a href="http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html"><font color=#7297ce>重载overloading和覆写overriding哪个更早执行--&nbsp;&nbsp; visitor帮助篇</font></a><br>虽然排列顺序是1,2,3,4 但是我个人建议的学习方式是2,1,3,4因为这个顺序更方便一般人理解</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/dreamstone/aggbug/88948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2006-12-20 01:26 <a href="http://www.blogjava.net/dreamstone/archive/2006/12/20/88948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态分派，动态分派，多分派，单分派 --------------   visitor模式准备</title><link>http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Tue, 19 Dec 2006 17:08:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/88947.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/88947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/88947.html</trackback:ping><description><![CDATA[一，静态分派:<br>1，定义：发生在编译时期，分派根据静态类型信息发生，重载就是静态分派<br>2，什么是静态类型：变量被声明时的类型是静态类型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;什么是动态类型：变量所引用的对象的真实类型<br>3，有两个类,BlackCat ,WhiteCat都继承自Cat<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_9_10_Open_Image onclick="this.style.display='none'; Codehighlighter1_9_10_Open_Text.style.display='none'; Codehighlighter1_9_10_Closed_Image.style.display='inline'; Codehighlighter1_9_10_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_9_10_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_9_10_Closed_Text.style.display='none'; Codehighlighter1_9_10_Open_Image.style.display='inline'; Codehighlighter1_9_10_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Cat</span><span id=Codehighlighter1_9_10_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_9_10_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_38_39_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_39_Open_Text.style.display='none'; Codehighlighter1_38_39_Closed_Image.style.display='inline'; Codehighlighter1_38_39_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_38_39_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_39_Closed_Text.style.display='none'; Codehighlighter1_38_39_Open_Image.style.display='inline'; Codehighlighter1_38_39_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;WhiteCat&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Cat</span><span id=Codehighlighter1_38_39_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_38_39_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_67_68_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_68_Open_Text.style.display='none'; Codehighlighter1_67_68_Closed_Image.style.display='inline'; Codehighlighter1_67_68_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_67_68_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_68_Closed_Text.style.display='none'; Codehighlighter1_67_68_Open_Image.style.display='inline'; Codehighlighter1_67_68_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BlackCat&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Cat</span><span id=Codehighlighter1_67_68_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_67_68_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_90_462_Open_Image onclick="this.style.display='none'; Codehighlighter1_90_462_Open_Text.style.display='none'; Codehighlighter1_90_462_Closed_Image.style.display='inline'; Codehighlighter1_90_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_90_462_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_462_Closed_Text.style.display='none'; Codehighlighter1_90_462_Open_Image.style.display='inline'; Codehighlighter1_90_462_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">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Person&nbsp;</span><span id=Codehighlighter1_90_462_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_90_462_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_118_155_Open_Image onclick="this.style.display='none'; Codehighlighter1_118_155_Open_Text.style.display='none'; Codehighlighter1_118_155_Closed_Image.style.display='inline'; Codehighlighter1_118_155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_118_155_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_155_Closed_Text.style.display='none'; Codehighlighter1_118_155_Open_Image.style.display='inline'; Codehighlighter1_118_155_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;feed(Cat&nbsp;cat)</span><span id=Codehighlighter1_118_155_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_118_155_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">feed&nbsp;cat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_188_230_Open_Image onclick="this.style.display='none'; Codehighlighter1_188_230_Open_Text.style.display='none'; Codehighlighter1_188_230_Closed_Image.style.display='inline'; Codehighlighter1_188_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_188_230_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_188_230_Closed_Text.style.display='none'; Codehighlighter1_188_230_Open_Image.style.display='inline'; Codehighlighter1_188_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;feed(WhiteCat&nbsp;cat)</span><span id=Codehighlighter1_188_230_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_188_230_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">feed&nbsp;WhiteCat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_263_305_Open_Image onclick="this.style.display='none'; Codehighlighter1_263_305_Open_Text.style.display='none'; Codehighlighter1_263_305_Closed_Image.style.display='inline'; Codehighlighter1_263_305_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_263_305_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_263_305_Closed_Text.style.display='none'; Codehighlighter1_263_305_Open_Image.style.display='inline'; Codehighlighter1_263_305_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;feed(BlackCat&nbsp;cat)</span><span id=Codehighlighter1_263_305_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_263_305_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">feed&nbsp;BlackCat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_347_459_Open_Image onclick="this.style.display='none'; Codehighlighter1_347_459_Open_Text.style.display='none'; Codehighlighter1_347_459_Closed_Image.style.display='inline'; Codehighlighter1_347_459_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_347_459_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_347_459_Closed_Text.style.display='none'; Codehighlighter1_347_459_Open_Image.style.display='inline'; Codehighlighter1_347_459_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id=Codehighlighter1_347_459_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_347_459_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;wc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;WhiteCat();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;bc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BlackCat();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Person();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.feed(wc);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.feed(bc);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</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/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>
运行结果是:<br>feed cat<br>feed cat<br>这样的结果是因为重载是静态分派，在编译器执行的，取决于变量的声明类型，因为wc ,bc都是Cat所以调用的都是feed(Cat cat)的函数.<br>二，动态分派<br>1，定义：发生在运行期，动态分派，动态的置换掉某个方法。<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_9_67_Open_Image onclick="this.style.display='none'; Codehighlighter1_9_67_Open_Text.style.display='none'; Codehighlighter1_9_67_Closed_Image.style.display='inline'; Codehighlighter1_9_67_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_9_67_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_9_67_Closed_Text.style.display='none'; Codehighlighter1_9_67_Open_Image.style.display='inline'; Codehighlighter1_9_67_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Cat</span><span id=Codehighlighter1_9_67_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_9_67_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_29_65_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_65_Open_Text.style.display='none'; Codehighlighter1_29_65_Closed_Image.style.display='inline'; Codehighlighter1_29_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_29_65_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_65_Closed_Text.style.display='none'; Codehighlighter1_29_65_Open_Image.style.display='inline'; Codehighlighter1_29_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;eat()</span><span id=Codehighlighter1_29_65_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_29_65_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cat&nbsp;eat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</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 id=Codehighlighter1_102_251_Open_Image onclick="this.style.display='none'; Codehighlighter1_102_251_Open_Text.style.display='none'; Codehighlighter1_102_251_Closed_Image.style.display='inline'; Codehighlighter1_102_251_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_102_251_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_251_Closed_Text.style.display='none'; Codehighlighter1_102_251_Open_Image.style.display='inline'; Codehighlighter1_102_251_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">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BlackCat&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Cat</span><span id=Codehighlighter1_102_251_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_102_251_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_122_164_Open_Image onclick="this.style.display='none'; Codehighlighter1_122_164_Open_Text.style.display='none'; Codehighlighter1_122_164_Closed_Image.style.display='inline'; Codehighlighter1_122_164_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_122_164_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_164_Closed_Text.style.display='none'; Codehighlighter1_122_164_Open_Image.style.display='inline'; Codehighlighter1_122_164_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;eat()</span><span id=Codehighlighter1_122_164_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_122_164_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">black&nbsp;cat&nbsp;eat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_205_249_Open_Image onclick="this.style.display='none'; Codehighlighter1_205_249_Open_Text.style.display='none'; Codehighlighter1_205_249_Closed_Image.style.display='inline'; Codehighlighter1_205_249_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_205_249_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_205_249_Closed_Text.style.display='none'; Codehighlighter1_205_249_Open_Image.style.display='inline'; Codehighlighter1_205_249_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)</span><span id=Codehighlighter1_205_249_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_205_249_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BlackCat();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat.eat();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
这个时候的结果是:<br>black cat eat<br>这样的结果是因为在执行期发生了向下转型，就是动态分派了。<br><br>三，单分派：<br>1，定义：根据一个宗量的类型进行方法的选择<br>四,多分派：<br>1，定义：根据多于一个宗量的类型对方法的选择<br>2，说明：多分派其实是一系列的单分派组成的，区别的地方就是这些但分派不能分割。<br>3,C++ ,Java都是动态单分派，静态多分派语言<br>多分派的语言有：CLOS&nbsp; Cecil<br><br>最后的部分：
<p>看完本文，如果你对visitor模式有更多的兴趣，想了解更多请看如下几篇文章。<br>1,<a href="http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html"><font color=#7297ce>静态分派，动态分派，多分派，单分派 --------------&nbsp;&nbsp; visitor模式准备</font></a><a href="http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html"><font color=#7297ce>(<font color=#000000>本文）</font><br></font></a>2<a href="http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html"><font color=#7297ce>,访问差异类型的集合类 ------------------------&nbsp;&nbsp; visitor模式入门</font></a><br>3,<a href="http://www.blogjava.net/dreamstone/archive/2006/12/20/88948.html">visitor模式理论及学术概念-------------－-----&nbsp;&nbsp; visitor模式进一步<br></a>4，<a href="http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html">重载overloading和覆写overriding哪个更早执行--&nbsp;&nbsp; visitor帮助篇</a><br>虽然排列顺序是1,2,3,4但是我个人建议的学习方式是2,1,3,4因为这个顺序更方便一般人理解</p>
<img src ="http://www.blogjava.net/dreamstone/aggbug/88947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2006-12-20 01:08 <a href="http://www.blogjava.net/dreamstone/archive/2006/12/20/88947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>访问差异类型的集合类--visitor模式入门</title><link>http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Mon, 18 Dec 2006 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/88623.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2006/12/18/88623.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/88623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/88623.html</trackback:ping><description><![CDATA[<p>访问差异类型的集合类--visitor模式入门<br>本文对应代码下载<a href="http://www.blogjava.net/Files/dreamstone/visitor.rar">这里</a><br>一，问题提出<br>访问同一类型的集合类是我们最常见的事情了，我们工作中这样的代码太常见了。<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"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">Iterator&nbsp;ie&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;list.iterator();<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img id=Codehighlighter1_50_96_Open_Image onclick="this.style.display='none'; Codehighlighter1_50_96_Open_Text.style.display='none'; Codehighlighter1_50_96_Closed_Image.style.display='inline'; Codehighlighter1_50_96_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_50_96_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_96_Closed_Text.style.display='none'; Codehighlighter1_50_96_Open_Image.style.display='inline'; Codehighlighter1_50_96_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">(ie.hasNext())</span> <span id=Codehighlighter1_50_96_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_96_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;p&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;(Person)ie.next();<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;p.doWork();<br></span><span style="COLOR: #008080">5</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<p><br>这种访问的特点是集合类中的对象是同一类对象Person，他们拥有功能的方法run,我们调用的恰好是这个共同的方法。<br>在大部份的情况下，这个是可以的，但在一些复杂的情况，如被访问者的继承结构复杂，被访问者的并不是同一类对象，<br>也就是说不是继承自同一个根类。方法名也并不相同。例如Java GUI中的事件就是一个例子。<br>例如这样的问题，有如下类和方法:<br>类：PA ,方法：runPA();<br>类：PB ,方法：runPB();<br>类：PC ,方法：runPC();<br>类：PD ,方法：runPD();<br>类：PE ,方法：runPE();<br>有一个集合类List<br>List list = new ArrayList();<br>list.add(new PA());<br>list.add(new PB());<br>list.add(new PC());<br>list.add(new PD());<br>list.add(new PE());<br>....<br>二:解决<br>要求能访问到每个类的对应的方法。我们第一反应应该是这样的。<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"><span style="COLOR: #008080">&nbsp;1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">Iterator&nbsp;ie&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;list.iterator();<br></span><span style="COLOR: #008080">&nbsp;2</span> <span style="COLOR: #000000"><img id=Codehighlighter1_50_330_Open_Image onclick="this.style.display='none'; Codehighlighter1_50_330_Open_Text.style.display='none'; Codehighlighter1_50_330_Closed_Image.style.display='inline'; Codehighlighter1_50_330_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_50_330_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_330_Closed_Text.style.display='none'; Codehighlighter1_50_330_Open_Image.style.display='inline'; Codehighlighter1_50_330_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">(ie.hasNext())</span> <span id=Codehighlighter1_50_330_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_330_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;ie.next();<br></span><span style="COLOR: #008080">&nbsp;4</span> <span style="COLOR: #000000"><img id=Codehighlighter1_100_124_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_124_Open_Text.style.display='none'; Codehighlighter1_100_124_Closed_Image.style.display='inline'; Codehighlighter1_100_124_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_100_124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_124_Closed_Text.style.display='none'; Codehighlighter1_100_124_Open_Image.style.display='inline'; Codehighlighter1_100_124_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(obj&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;PA)</span> <span id=Codehighlighter1_100_124_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_100_124_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PA)obj).runPA();<br></span><span style="COLOR: #008080">&nbsp;6</span> <span style="COLOR: #000000"><img id=Codehighlighter1_151_175_Open_Image onclick="this.style.display='none'; Codehighlighter1_151_175_Open_Text.style.display='none'; Codehighlighter1_151_175_Closed_Image.style.display='inline'; Codehighlighter1_151_175_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_151_175_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_175_Closed_Text.style.display='none'; Codehighlighter1_151_175_Open_Image.style.display='inline'; Codehighlighter1_151_175_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(obj&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;PB)</span> <span id=Codehighlighter1_151_175_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_151_175_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PB)obj).runPB();<br></span><span style="COLOR: #008080">&nbsp;8</span> <span style="COLOR: #000000"><img id=Codehighlighter1_202_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_202_226_Open_Text.style.display='none'; Codehighlighter1_202_226_Closed_Image.style.display='inline'; Codehighlighter1_202_226_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_202_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_202_226_Closed_Text.style.display='none'; Codehighlighter1_202_226_Open_Image.style.display='inline'; Codehighlighter1_202_226_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(obj&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;PC)</span> <span id=Codehighlighter1_202_226_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_202_226_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PC)obj).runPC();<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><img id=Codehighlighter1_253_277_Open_Image onclick="this.style.display='none'; Codehighlighter1_253_277_Open_Text.style.display='none'; Codehighlighter1_253_277_Closed_Image.style.display='inline'; Codehighlighter1_253_277_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_253_277_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_253_277_Closed_Text.style.display='none'; Codehighlighter1_253_277_Open_Image.style.display='inline'; Codehighlighter1_253_277_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(obj&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;PD)</span> <span id=Codehighlighter1_253_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_253_277_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PD)obj).runPD();<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><img id=Codehighlighter1_304_328_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_328_Open_Text.style.display='none'; Codehighlighter1_304_328_Closed_Image.style.display='inline'; Codehighlighter1_304_328_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_304_328_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_328_Closed_Text.style.display='none'; Codehighlighter1_304_328_Open_Image.style.display='inline'; Codehighlighter1_304_328_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(obj&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;PE)</span> <span id=Codehighlighter1_304_328_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_304_328_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PE)obj).runPE();<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<p><br>三：新问题及分析解决<br>当数目变多的时候，维护if else是个费力气的事情：<br>仔细分析if,else做的工作，首先判断类型，然後根据类型执行相应的函数<br>如何才能解决这两个问题呢？首先想到的是java的多态，多态就是根据参数执行相应的内容，<br>能很容易的解决第二个问题，我们可以写这样一个类：<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"><span style="COLOR: #008080">&nbsp;1</span> <img id=Codehighlighter1_20_232_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_232_Open_Text.style.display='none'; Codehighlighter1_20_232_Closed_Image.style.display='inline'; Codehighlighter1_20_232_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_20_232_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_232_Closed_Text.style.display='none'; Codehighlighter1_20_232_Open_Image.style.display='inline'; Codehighlighter1_20_232_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">&nbsp;</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;visitor</span> <span id=Codehighlighter1_20_232_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_20_232_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;2</span> <span style="COLOR: #000000"><img id=Codehighlighter1_45_62_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_62_Open_Text.style.display='none'; Codehighlighter1_45_62_Closed_Image.style.display='inline'; Codehighlighter1_45_62_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_45_62_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_62_Closed_Text.style.display='none'; Codehighlighter1_45_62_Open_Image.style.display='inline'; Codehighlighter1_45_62_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;run(PA&nbsp;pa)</span> <span id=Codehighlighter1_45_62_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_45_62_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa.runPA();<br></span><span style="COLOR: #008080">&nbsp;4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span> <span style="COLOR: #000000"><img id=Codehighlighter1_87_104_Open_Image onclick="this.style.display='none'; Codehighlighter1_87_104_Open_Text.style.display='none'; Codehighlighter1_87_104_Closed_Image.style.display='inline'; Codehighlighter1_87_104_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_87_104_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_104_Closed_Text.style.display='none'; Codehighlighter1_87_104_Open_Image.style.display='inline'; Codehighlighter1_87_104_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;run(PB&nbsp;pb)</span> <span id=Codehighlighter1_87_104_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_87_104_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pb.runPB();<br></span><span style="COLOR: #008080">&nbsp;7</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span> <span style="COLOR: #000000"><img id=Codehighlighter1_129_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_129_146_Open_Text.style.display='none'; Codehighlighter1_129_146_Closed_Image.style.display='inline'; Codehighlighter1_129_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_129_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_146_Closed_Text.style.display='none'; Codehighlighter1_129_146_Open_Image.style.display='inline'; Codehighlighter1_129_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;run(PC&nbsp;pc)</span> <span id=Codehighlighter1_129_146_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_129_146_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc.runPC();<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"><img id=Codehighlighter1_171_188_Open_Image onclick="this.style.display='none'; Codehighlighter1_171_188_Open_Text.style.display='none'; Codehighlighter1_171_188_Closed_Image.style.display='inline'; Codehighlighter1_171_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_171_188_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_188_Closed_Text.style.display='none'; Codehighlighter1_171_188_Open_Image.style.display='inline'; Codehighlighter1_171_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;run(PD&nbsp;pd)</span> <span id=Codehighlighter1_171_188_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_171_188_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pd.runPD();<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000"><img id=Codehighlighter1_213_230_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_230_Open_Text.style.display='none'; Codehighlighter1_213_230_Closed_Image.style.display='inline'; Codehighlighter1_213_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_213_230_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_230_Closed_Text.style.display='none'; Codehighlighter1_213_230_Open_Image.style.display='inline'; Codehighlighter1_213_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;run(PE&nbsp;pe)</span> <span id=Codehighlighter1_213_230_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_213_230_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pe.runPE();<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<p><br>这样只要调用run方法，传入对应的参数就能执行了。<br>还有一个问题就是判断类型。由于重载(overloading)是静态多分配（java语言本身是支持"静态多分配"的。<br>关于这个概念请看这里)所以造成重载只根据传入对象的定义类型，而不是实际的类型，所以必须在传入前就确定类型，<br>这可是个难的问题,因为在容器中对象全是Object，出来后要是判断是什么类型必须用<br>if (xx instanceof xxx)这种方法，如果用这种方法启不是又回到了原点，有没有什么更好的办法呢？</p>
<p>我们知到Java还有另外一个特点，覆写(overriding)，而覆写是"动态单分配"的（关于这个概念见这里)，<br>那如何利用这个来实现呢？看下边这个方法:<br>&nbsp;我们让上边的一些类PA PB PC PD PE都实现一个接口P,加入一个方法,accept();<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"><span style="COLOR: #008080">&nbsp;1</span> <img id=Codehighlighter1_29_55_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_55_Open_Text.style.display='none'; Codehighlighter1_29_55_Closed_Image.style.display='inline'; Codehighlighter1_29_55_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_29_55_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_55_Closed_Text.style.display='none'; Codehighlighter1_29_55_Open_Image.style.display='inline'; Codehighlighter1_29_55_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">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;accept(visitor&nbsp;v)</span> <span id=Codehighlighter1_29_55_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_29_55_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">把自己传入1</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;3</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;v.run(</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>然後在visitor中加入一个方法<br></span><span style="COLOR: #008080">&nbsp;6</span> <span style="COLOR: #000000"><img id=Codehighlighter1_95_124_Open_Image onclick="this.style.display='none'; Codehighlighter1_95_124_Open_Text.style.display='none'; Codehighlighter1_95_124_Closed_Image.style.display='inline'; Codehighlighter1_95_124_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_95_124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_95_124_Closed_Text.style.display='none'; Codehighlighter1_95_124_Open_Image.style.display='inline'; Codehighlighter1_95_124_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">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;run(P&nbsp;p)</span> <span id=Codehighlighter1_95_124_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_95_124_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">把自己传入2</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;8</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;p.accept(</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;9</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">这样你在遍历中可以这样写</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #000000">Visitor&nbsp;v&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;Visitor();<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Iterator&nbsp;ie&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;list.iterator();<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000"><img id=Codehighlighter1_218_257_Open_Image onclick="this.style.display='none'; Codehighlighter1_218_257_Open_Text.style.display='none'; Codehighlighter1_218_257_Closed_Image.style.display='inline'; Codehighlighter1_218_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_218_257_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_257_Closed_Text.style.display='none'; Codehighlighter1_218_257_Open_Image.style.display='inline'; Codehighlighter1_218_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">(ie.hasNext())</span> <span id=Codehighlighter1_218_257_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_218_257_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;P&nbsp;p&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;(P)ie.next();<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.accept(v);<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>}</span> </div>
<p><br>首先执行的是"把自己传入2"，在这里由于Java的特性，实际执行的是子类的accept(),也就是实际类的accept<br>然後是"把自己传入1"，在这里再次把this传入，就明确类型，ok我们巧妙的利用overriding解决了这个问题<br>其实归纳一下第二部分，一个关键点是"自己认识自己"，是不是很可笑。<br>其实在计算计技术领域的很多技术上看起来很高深的东西，其实就是现有社会中人的生活方式的一种映射<br>而且这种方式是简单的不能再简单的方式。上边的全部过程基本上是一个简单的visitor模式实现,visitor模式<br>已经是设计模式中比较复杂的模式了，但其实原理简单到你想笑。看看下边这个比喻也许你的理解会更深刻。</p>
<p>四：一个帮助理解的比喻：<br>题目：指挥工人工作<br>条件：你有10个全能工人，10样相同工作。<br>需求：做完工作<br>实现：大喊一声所有人去工作</p>
<p>条件变了，工人不是全能，但是工作相同，ok问题不大<br>条件再变,工作不是相同，但工人是全能，ok问题不大</p>