﻿<?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-我的漫漫程序之旅-文章分类-设计模式</title><link>http://www.blogjava.net/supercrsky/category/31490.html</link><description>专注于JavaWeb开发</description><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 10:41:41 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 10:41:41 GMT</pubDate><ttl>60</ttl><item><title>Flyweight模式 的学习 </title><link>http://www.blogjava.net/supercrsky/articles/203143.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Tue, 27 May 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/203143.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/203143.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/203143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/203143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/203143.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: Verdana"><strong>一、Flyweight模式的意图：<br style="font-family: " />
</strong><br style="font-family: " />
缓存(共享)可以共同的对象、属性，避免创建大量的重复对象、内容。<br style="font-family: " />
<br style="font-family: " />
<strong>二、Flyweight模式的特点：<br style="font-family: " />
</strong><br style="font-family: " />
为重复或可共享的对象、属性设置一个缓冲，称为内部属性。这些内部属性一般情况下都是不可修改的，也就是在第一个对象、属性被创建后，就不会去修改了(否则就没意义了)。<br style="font-family: " />
<br style="font-family: " />
除了共享对象、属性之外，还有一些是基于应用环境，或是实时数据，这些无法共享的东西我们称为外部状态。<br style="font-family: " />
<br style="font-family: " />
在Flyweight模式应用中，通常修改的是外部状态属性，而内部状态属性一般都是用于参考或计算时引用。<br style="font-family: " />
<br style="font-family: " />
<strong>三、Flyweight模式的构成：<br />
<img height="292" alt="" src="http://www.blogjava.net/images/blogjava_net/pengpenglin/设计模式/Flyweight.JPG" width="571" border="0" /><br />
<br />
</strong>
<p><strong>Flyweight模式一般由几个部分组成：</strong></p>
<p><span style="color: red">&#183;Flyweight接口(抽象类) </span>：定义了一个可共享的元类<br />
<span style="color: red">&#183;Flyweight实现类</span>：实现了元类中的操作，而且可能会提供一个用于保存内部状态(共享属性)的空间<br />
<span style="color: red">&#183;Flyweight Factory</span>：创建Flyweight的工厂类，创建后将其保存到Flyweight Pool中<br />
<span style="color: red">&#183;Flyweight Pool</span>：缓冲Flyweight对象的池，通常包含在工厂类中<br />
<br />
<br />
<strong>四、Flyweight模式的简单实现<br />
<br />
1.Flyweight:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.flyweight2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></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">class</span><span style="color: #000000">&nbsp;Flyweight<br />
<img id="Codehighlighter1_65_102_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_102_Open_Text.style.display='none'; Codehighlighter1_65_102_Closed_Image.style.display='inline'; Codehighlighter1_65_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_65_102_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_65_102_Closed_Text.style.display='none'; Codehighlighter1_65_102_Open_Image.style.display='inline'; Codehighlighter1_65_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_65_102_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"  alt="" /></span><span id="Codehighlighter1_65_102_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;operation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
2.ConcreateFlyweight:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.flyweight2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateFlyweight&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Flyweight<br />
<img id="Codehighlighter1_83_250_Open_Image" onclick="this.style.display='none'; Codehighlighter1_83_250_Open_Text.style.display='none'; Codehighlighter1_83_250_Closed_Image.style.display='inline'; Codehighlighter1_83_250_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_83_250_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_83_250_Closed_Text.style.display='none'; Codehighlighter1_83_250_Open_Image.style.display='inline'; Codehighlighter1_83_250_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_83_250_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"  alt="" /></span><span id="Codehighlighter1_83_250_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;key;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ConcreateFlyweight(Object&nbsp;key)<br />
<img id="Codehighlighter1_147_168_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_168_Open_Text.style.display='none'; Codehighlighter1_147_168_Closed_Image.style.display='inline'; Codehighlighter1_147_168_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_147_168_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_147_168_Closed_Text.style.display='none'; Codehighlighter1_147_168_Open_Image.style.display='inline'; Codehighlighter1_147_168_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_147_168_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"  alt="" /></span><span id="Codehighlighter1_147_168_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;key;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;operation()<br />
<img id="Codehighlighter1_208_247_Open_Image" onclick="this.style.display='none'; Codehighlighter1_208_247_Open_Text.style.display='none'; Codehighlighter1_208_247_Closed_Image.style.display='inline'; Codehighlighter1_208_247_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_208_247_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_208_247_Closed_Text.style.display='none'; Codehighlighter1_208_247_Open_Image.style.display='inline'; Codehighlighter1_208_247_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_208_247_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"  alt="" /></span><span id="Codehighlighter1_208_247_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">key:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;key);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</strong></span>3.FlyweightFactory:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.flyweight2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Hashtable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@SuppressWarnings(</span><span style="color: #000000">"</span><span style="color: #000000">unchecked</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FlyweightFactory<br />
<img id="Codehighlighter1_123_555_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_555_Open_Text.style.display='none'; Codehighlighter1_123_555_Closed_Image.style.display='inline'; Codehighlighter1_123_555_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_555_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_555_Closed_Text.style.display='none'; Codehighlighter1_123_555_Open_Image.style.display='inline'; Codehighlighter1_123_555_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_123_555_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"  alt="" /></span><span id="Codehighlighter1_123_555_Open_Text"><span style="color: #000000">{<br />
　<span style="color: #008000">//</span><span style="color: #008000">Flyweight&nbsp;pool</span><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Hashtable&nbsp;flyweights&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Hashtable();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Flyweight&nbsp;getFlyweight(Object&nbsp;key)<br />
<img id="Codehighlighter1_219_485_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_485_Open_Text.style.display='none'; Codehighlighter1_219_485_Closed_Image.style.display='inline'; Codehighlighter1_219_485_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_219_485_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_219_485_Closed_Text.style.display='none'; Codehighlighter1_219_485_Open_Image.style.display='inline'; Codehighlighter1_219_485_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_219_485_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"  alt="" /></span><span id="Codehighlighter1_219_485_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flyweight&nbsp;flyweight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(flyweights.containsKey(key))<br />
<img id="Codehighlighter1_287_339_Open_Image" onclick="this.style.display='none'; Codehighlighter1_287_339_Open_Text.style.display='none'; Codehighlighter1_287_339_Closed_Image.style.display='inline'; Codehighlighter1_287_339_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_287_339_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_287_339_Closed_Text.style.display='none'; Codehighlighter1_287_339_Open_Image.style.display='inline'; Codehighlighter1_287_339_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_287_339_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"  alt="" /></span><span id="Codehighlighter1_287_339_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flyweight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Flyweight)&nbsp;flyweights.get(key);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">flyweights.containsKey(key))<br />
<img id="Codehighlighter1_379_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_379_462_Open_Text.style.display='none'; Codehighlighter1_379_462_Closed_Image.style.display='inline'; Codehighlighter1_379_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_379_462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_379_462_Closed_Text.style.display='none'; Codehighlighter1_379_462_Open_Image.style.display='inline'; Codehighlighter1_379_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_379_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"  alt="" /></span><span id="Codehighlighter1_379_462_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flyweight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateFlyweight(key);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flyweights.put(key,&nbsp;flyweight);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flyweight;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getFlyweightsSize()<br />
<img id="Codehighlighter1_522_553_Open_Image" onclick="this.style.display='none'; Codehighlighter1_522_553_Open_Text.style.display='none'; Codehighlighter1_522_553_Closed_Image.style.display='inline'; Codehighlighter1_522_553_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_522_553_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_522_553_Closed_Text.style.display='none'; Codehighlighter1_522_553_Open_Image.style.display='inline'; Codehighlighter1_522_553_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_522_553_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"  alt="" /></span><span id="Codehighlighter1_522_553_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flyweights.size();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
4.测试类:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.flyweight2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
<img id="Codehighlighter1_53_651_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_651_Open_Text.style.display='none'; Codehighlighter1_53_651_Closed_Image.style.display='inline'; Codehighlighter1_53_651_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_53_651_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_53_651_Closed_Text.style.display='none'; Codehighlighter1_53_651_Open_Image.style.display='inline'; Codehighlighter1_53_651_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_53_651_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"  alt="" /></span><span id="Codehighlighter1_53_651_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Flyweight&nbsp;f1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Flyweight&nbsp;f2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Flyweight&nbsp;f3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Flyweight&nbsp;f4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;FlyweightFactory&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;FlyweightFactory();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Client()<br />
<img id="Codehighlighter1_246_403_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_403_Open_Text.style.display='none'; Codehighlighter1_246_403_Closed_Image.style.display='inline'; Codehighlighter1_246_403_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_246_403_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_246_403_Closed_Text.style.display='none'; Codehighlighter1_246_403_Open_Image.style.display='inline'; Codehighlighter1_246_403_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_246_403_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"  alt="" /></span><span id="Codehighlighter1_246_403_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;factory.getFlyweight(</span><span style="color: #000000">"</span><span style="color: #000000">baidu</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;factory.getFlyweight(</span><span style="color: #000000">"</span><span style="color: #000000">google</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;factory.getFlyweight(</span><span style="color: #000000">"</span><span style="color: #000000">baidu</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;factory.getFlyweight(</span><span style="color: #000000">"</span><span style="color: #000000">google</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;show()<br />
<img id="Codehighlighter1_427_553_Open_Image" onclick="this.style.display='none'; Codehighlighter1_427_553_Open_Text.style.display='none'; Codehighlighter1_427_553_Closed_Image.style.display='inline'; Codehighlighter1_427_553_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_427_553_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_427_553_Closed_Text.style.display='none'; Codehighlighter1_427_553_Open_Image.style.display='inline'; Codehighlighter1_427_553_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_427_553_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"  alt="" /></span><span id="Codehighlighter1_427_553_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f1.operation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f2.operation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f3.operation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4.operation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(factory.getFlyweightsSize());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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)<br />
<img id="Codehighlighter1_597_649_Open_Image" onclick="this.style.display='none'; Codehighlighter1_597_649_Open_Text.style.display='none'; Codehighlighter1_597_649_Closed_Image.style.display='inline'; Codehighlighter1_597_649_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_597_649_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_597_649_Closed_Text.style.display='none'; Codehighlighter1_597_649_Open_Image.style.display='inline'; Codehighlighter1_597_649_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_597_649_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"  alt="" /></span><span id="Codehighlighter1_597_649_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Client();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.show();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
也就是在缓冲这一点上，体现了Flyweight模式的精髓。
<img src ="http://www.blogjava.net/supercrsky/aggbug/203143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-27 10:42 <a href="http://www.blogjava.net/supercrsky/articles/203143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java设计模式之Facade模式</title><link>http://www.blogjava.net/supercrsky/articles/202854.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Mon, 26 May 2008 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202854.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202854.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202854.html</trackback:ping><description><![CDATA[GOF<span style="font-family: 宋体">《设计模式》一书对</span>Facade<span style="font-family: 宋体">模式是这样描述的</span>:
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">为子系统中的一组接口提供一个统一接口。</span>Facade<span style="font-family: 宋体">模式定义了一个更高层的接口，使子系统更加容易使用。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">大致意思是说：使用一种比原有方式更简单的办法与系统交互。例如，我们把一个很文件的文件，放在了第二抽屉里，而第二个抽屉的钥匙放在了第一个抽屉里，我们要想取出这个文件，第一步肯定要拿到第一个抽屉的钥匙，然后打开它再拿出第二个抽屉的钥匙，最后打开第二个抽屉取出文件。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">我就上面说的那个情形写一下实现代码，首先我们要实现二个子系统,呵呵，把抽屉比喻成系统，有点夸张了（</span><span style="background: silver; color: black; font-family: 'Courier New'">DrawerOne</span><span style="font-family: 宋体">、</span><span style="color: black; font-family: 'Courier New'">DrawerTwo</span><span style="font-family: 宋体">）：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerOne {</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> open(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">第一个抽屉被打开了</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getKey();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> getKey(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">得到第二个抽屉的钥匙</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerTwo{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> open(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">第二个抽屉被打开了</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getFile();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> getFile(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">得到这个重要文件</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> Client{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> main(String []args){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawerOne darwerOne=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerOne();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawerTwo darwerTwo=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerTwo();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; darwerOne.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; darwerTwo.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: black; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="color: black; font-family: 宋体">由于没有使用</span><span style="color: black; font-family: 'Courier New'">Fa&#231;ade</span><span style="color: black; font-family: 宋体">模式，可以看到要想得到这个文件要首先打开第一个抽屉，然后再打开第二个抽屉，在我们实际所开发的系统中，有时候客户要实现某一操作，并不需要知道实现这一操作的详细步骤，而是简单地点击某一个按钮就可以得到自己想要的结果。下面对上面的代码使用</span><span style="color: black; font-family: 'Courier New'">Fa&#231;ade</span><span style="color: black; font-family: 宋体">模式进行改进，建立一个</span><span style="color: black; font-family: 'Courier New'">FacadeDrawer</span><span style="color: black; font-family: 宋体">类：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerFacade{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; DrawerOne </span><span style="color: #0000c0; font-family: 'Courier New'">darwerOne</span><span style="color: black; font-family: 'Courier New'">=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerOne();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; DrawerTwo </span><span style="color: #0000c0; font-family: 'Courier New'">darwerTwo</span><span style="color: black; font-family: 'Courier New'">=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerTwo();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> open(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 'Courier New'">darwerOne</span><span style="color: black; font-family: 'Courier New'">.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 'Courier New'">darwerTwo</span><span style="color: black; font-family: 'Courier New'">.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: black; font-family: 'Courier New'">}</span></p>
<p><span style="color: black; font-family: 宋体">修改</span><span style="color: black; font-family: 'Courier New'">Client</span><span style="color: black; font-family: 宋体">类：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerClient{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> main(String []args){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawerFacade drawer=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerFacade();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drawer.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: black; font-family: 'Courier New'">}</span></p>
<p><span style="color: black; font-family: 宋体">输出结果如下：</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">第一个抽屉被打开了</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">得到第二个抽屉的钥匙</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">第二个抽屉被打开了</span></p>
<p><span style="color: black; font-family: 宋体">得到这个重要文件</span></p>
<p style="text-indent: 21pt"><span style="color: black; font-family: 宋体">正如上面所说，客户端</span><span style="color: black; font-family: 'Courier New'">client</span><span style="color: black; font-family: 宋体">，它并不需要关心子系统，而是关心</span><span style="color: black; font-family: 'Courier New'">DrawerFacade</span><span style="color: black; font-family: 宋体">所留下来的和外部交互的接口，而子系统在</span><span style="color: black; font-family: 'Courier New'">DrawerFacade</span><span style="color: black; font-family: 宋体">的聚合。</span></p>
<p style="text-indent: 21pt"><span style="color: black; font-family: 宋体">以上只是个人拙见，哪里有不正确的地方，希望大家多多批评指正。</span><span style="color: black; font-family: 'Courier New'">^_^</span></p>
<p><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Facade</span><span style="color: black; font-family: 宋体">模式主要适用于以下几种情况</span><span style="color: black; font-family: 'Courier New'">:</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">不需要使用一个复杂系统的所有功能，而且可以创建一个新的类，包含访问系统的所有规则。如果只需要使用系统的部分功能，那么你为新类所创建的</span><span style="color: black; font-family: 'Courier New'">API</span><span style="color: black; font-family: 宋体">将比原系统的</span><span style="color: black; font-family: 'Courier New'">API</span><span style="color: black; font-family: 宋体">简单的多。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">希望封装或者隐藏系统原系统。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">3)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">希望使用原系统的功能，而且还希望增加一些新的功能。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">4)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。</span></p>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-26 11:01 <a href="http://www.blogjava.net/supercrsky/articles/202854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java设计模式之Bridge</title><link>http://www.blogjava.net/supercrsky/articles/202848.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Mon, 26 May 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202848.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202848.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202848.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Bridge定义 :将抽象和行为划分开来,各自独立,但能动态的结合.为什么使用?通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种:1. 这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩;这两个形状上的桩是并列的,没有概念上的重复,那么我们只...&nbsp;&nbsp;<a href='http://www.blogjava.net/supercrsky/articles/202848.html'>阅读全文</a><img src ="http://www.blogjava.net/supercrsky/aggbug/202848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-26 10:38 <a href="http://www.blogjava.net/supercrsky/articles/202848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Prototype模式的学习(原型模式) </title><link>http://www.blogjava.net/supercrsky/articles/202833.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Mon, 26 May 2008 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202833.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202833.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202833.html</trackback:ping><description><![CDATA[&nbsp;原型模式定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
<p>&nbsp;&nbsp;&nbsp; Prototype模式允许一个对象再创建另外一个可定制的对象，根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象，这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。</p>
<p><em><strong>如何使用?</strong></em> 因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.</p>
<p>以勺子为例：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.prototype;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_32_93_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_93_Open_Text.style.display='none'; Codehighlighter1_32_93_Closed_Image.style.display='inline'; Codehighlighter1_32_93_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_93_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_93_Closed_Text.style.display='none'; Codehighlighter1_32_93_Open_Image.style.display='inline'; Codehighlighter1_32_93_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_32_93_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">/**&nbsp;*/</span><span id="Codehighlighter1_32_93_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;原型类(以汤匙为例)&nbsp;,注意要实现Cloneable接口<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></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">class</span><span style="color: #000000">&nbsp;AbstractSpoon&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Cloneable<br />
<img id="Codehighlighter1_152_524_Open_Image" onclick="this.style.display='none'; Codehighlighter1_152_524_Open_Text.style.display='none'; Codehighlighter1_152_524_Closed_Image.style.display='inline'; Codehighlighter1_152_524_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_152_524_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_152_524_Closed_Text.style.display='none'; Codehighlighter1_152_524_Open_Image.style.display='inline'; Codehighlighter1_152_524_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_152_524_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"  alt="" /></span><span id="Codehighlighter1_152_524_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;spoonName;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSpoonName()<br />
<img id="Codehighlighter1_212_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_212_240_Open_Text.style.display='none'; Codehighlighter1_212_240_Closed_Image.style.display='inline'; Codehighlighter1_212_240_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_212_240_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_212_240_Closed_Text.style.display='none'; Codehighlighter1_212_240_Open_Image.style.display='inline'; Codehighlighter1_212_240_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_212_240_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"  alt="" /></span><span id="Codehighlighter1_212_240_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.spoonName;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;setSpoonName(String&nbsp;spoonName)<br />
<img id="Codehighlighter1_288_321_Open_Image" onclick="this.style.display='none'; Codehighlighter1_288_321_Open_Text.style.display='none'; Codehighlighter1_288_321_Closed_Image.style.display='inline'; Codehighlighter1_288_321_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_288_321_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_288_321_Closed_Text.style.display='none'; Codehighlighter1_288_321_Open_Image.style.display='inline'; Codehighlighter1_288_321_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_288_321_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"  alt="" /></span><span id="Codehighlighter1_288_321_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.spoonName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;spoonName;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_325_348_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_348_Open_Text.style.display='none'; Codehighlighter1_325_348_Closed_Image.style.display='inline'; Codehighlighter1_325_348_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_325_348_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_325_348_Closed_Text.style.display='none'; Codehighlighter1_325_348_Open_Image.style.display='inline'; Codehighlighter1_325_348_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_325_348_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">/**&nbsp;*/</span><span id="Codehighlighter1_325_348_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;重写clone()方法<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;clone()<br />
<img id="Codehighlighter1_385_522_Open_Image" onclick="this.style.display='none'; Codehighlighter1_385_522_Open_Text.style.display='none'; Codehighlighter1_385_522_Closed_Image.style.display='inline'; Codehighlighter1_385_522_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_385_522_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_385_522_Closed_Text.style.display='none'; Codehighlighter1_385_522_Open_Image.style.display='inline'; Codehighlighter1_385_522_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_385_522_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"  alt="" /></span><span id="Codehighlighter1_385_522_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_395_424_Open_Image" onclick="this.style.display='none'; Codehighlighter1_395_424_Open_Text.style.display='none'; Codehighlighter1_395_424_Closed_Image.style.display='inline'; Codehighlighter1_395_424_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_395_424_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_395_424_Closed_Text.style.display='none'; Codehighlighter1_395_424_Open_Image.style.display='inline'; Codehighlighter1_395_424_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_395_424_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"  alt="" /></span><span id="Codehighlighter1_395_424_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.clone();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(CloneNotSupportedException&nbsp;e)<br />
<img id="Codehighlighter1_465_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_465_504_Open_Text.style.display='none'; Codehighlighter1_465_504_Closed_Image.style.display='inline'; Codehighlighter1_465_504_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_465_504_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_465_504_Closed_Text.style.display='none'; Codehighlighter1_465_504_Open_Image.style.display='inline'; Codehighlighter1_465_504_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_465_504_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"  alt="" /></span><span id="Codehighlighter1_465_504_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">此对象不支持复制</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.prototype;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_32_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_72_Open_Text.style.display='none'; Codehighlighter1_32_72_Closed_Image.style.display='inline'; Codehighlighter1_32_72_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_72_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_72_Closed_Text.style.display='none'; Codehighlighter1_32_72_Open_Image.style.display='inline'; Codehighlighter1_32_72_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_32_72_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">/**&nbsp;*/</span><span id="Codehighlighter1_32_72_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;给原型对象赋值<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SoupSpoon&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;AbstractSpoon<br />
<img id="Codehighlighter1_119_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_177_Open_Text.style.display='none'; Codehighlighter1_119_177_Closed_Image.style.display='inline'; Codehighlighter1_119_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_119_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_119_177_Closed_Text.style.display='none'; Codehighlighter1_119_177_Open_Image.style.display='inline'; Codehighlighter1_119_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_119_177_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"  alt="" /></span><span id="Codehighlighter1_119_177_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SoupSpoon()<br />
<img id="Codehighlighter1_142_175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_142_175_Open_Text.style.display='none'; Codehighlighter1_142_175_Closed_Image.style.display='inline'; Codehighlighter1_142_175_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_142_175_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_142_175_Closed_Text.style.display='none'; Codehighlighter1_142_175_Open_Image.style.display='inline'; Codehighlighter1_142_175_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_142_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"  alt="" /></span><span id="Codehighlighter1_142_175_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSpoonName(</span><span style="color: #000000">"</span><span style="color: #000000">chinaDrong</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.prototype;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_32_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_145_Open_Text.style.display='none'; Codehighlighter1_32_145_Closed_Image.style.display='inline'; Codehighlighter1_32_145_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_145_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_145_Closed_Text.style.display='none'; Codehighlighter1_32_145_Open_Image.style.display='inline'; Codehighlighter1_32_145_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_32_145_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">/**&nbsp;*/</span><span id="Codehighlighter1_32_145_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">*****************************************************************************<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;测试类<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
<img id="Codehighlighter1_167_436_Open_Image" onclick="this.style.display='none'; Codehighlighter1_167_436_Open_Text.style.display='none'; Codehighlighter1_167_436_Closed_Image.style.display='inline'; Codehighlighter1_167_436_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_167_436_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_167_436_Closed_Text.style.display='none'; Codehighlighter1_167_436_Open_Image.style.display='inline'; Codehighlighter1_167_436_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_167_436_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"  alt="" /></span><span id="Codehighlighter1_167_436_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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)<br />
<img id="Codehighlighter1_210_434_Open_Image" onclick="this.style.display='none'; Codehighlighter1_210_434_Open_Text.style.display='none'; Codehighlighter1_210_434_Closed_Image.style.display='inline'; Codehighlighter1_210_434_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_210_434_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_210_434_Closed_Text.style.display='none'; Codehighlighter1_210_434_Open_Image.style.display='inline'; Codehighlighter1_210_434_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_210_434_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_210_434_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractSpoon&nbsp;spoon&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SoupSpoon();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(spoon.getSpoonName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;通过对象的clone()方法,即可获得对象的一个copy.</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractSpoon&nbsp;spoon2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(AbstractSpoon)&nbsp;spoon.clone();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(spoon2.getSpoonName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<p>当然也可以结合工厂模式来创建AbstractSpoon实例。</p>
<p>在Java中Prototype模式变成clone()方法的使用，由于Java的纯洁的面向对象特性，使得在Java中使用设计模式变得很自然，两者已经几乎是浑然一体了。这反映在很多模式上，如Interator遍历模式。</p>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-26 09:39 <a href="http://www.blogjava.net/supercrsky/articles/202833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装饰者模式(Decorator)浅谈与剖析</title><link>http://www.blogjava.net/supercrsky/articles/202691.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sun, 25 May 2008 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202691.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202691.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202691.html</trackback:ping><description><![CDATA[Central Perk<span style="font-family: 宋体">的名字因为《老友记》而享誉全球，他们的分店几乎开遍世界各地。他们发展的实在是太快了，所以他们此时正在急于实现一套由计算机管理的自动化记账系统。在第一次研究了他们的需求以后，开发者设计了如下图的类结构：</span>
<p style="margin: 0cm 0cm 0pt"><span><span>
<div align="center"><img height="389" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator1.jpg" width="554" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Beverage</span><span style="font-family: 宋体">是所有饮料的基类；</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">是抽象方法，所有子类都需要定义它们自己的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">实现来返回特定饮料的价钱；</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">description</span><span style="font-family: 宋体">变量也是在子类里赋值的，表示特定饮料的描述信息，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">getDescription()</span><span style="font-family: 宋体">方法可以返回这个描述；</span>&nbsp;&nbsp;
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">除了咖啡以为，</span>Central Perk<span style="font-family: 宋体">还提供丰富的调味品，比如：炼乳、巧克力、砂糖、牛奶等，而且这些调味品也是要单独按份收费的，所以调味品也是订单系统中重要的一部分。</span></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">于是，考虑到调味品的管理，开发者又有了下面这样的类结构：</span></p>
<p style="margin: 0cm 0cm 0pt"><span><span>
<div align="center"><img height="478" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator2.jpg" width="553" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">看了上面的类图，你一定有话要说！是的！这简直是太恐怖了，好像是整个类图都要爆炸了一样，而且以后随便增加一种调味品，继承于</span>Beverage<span style="font-family: 宋体">的子类还会翻倍！</span>(<span style="font-family: 宋体">因为理论上可能的咖啡种类数</span> = <span style="font-family: 宋体">咖啡类别数&#215;调味品类别数</span>) <span style="font-family: 宋体">我的神啊！全球变暖后连咖啡都&#8220;沸腾&#8221;了吗？还是我们在研制某种自杀式炸弹装置！</span><span style="font-size: 9pt; color: red">(</span><span style="font-size: 9pt; color: red; font-family: 宋体">方便携带，不宜察觉，居家旅游必备，只要将几种调味品混合到一起，就能产生惊人的爆炸力！不错啊！</span><span style="font-size: 9pt; color: red; font-family: Wingdings">J</span><span style="font-size: 9pt; color: red">)</span>&nbsp;&nbsp;
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">上面的情况绝对是不能容忍的，于是开发者们经过讨论，又提出了下面的设计方案件：</span></p>
<p style="margin: 0cm 0cm 0pt"><span><span>
<div align="center"><img height="329" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator3.jpg" width="554" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如图所示，这是改进后的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Beverage</span><span style="font-family: 宋体">基类。首先在基类里增加了表示是否包含特定调味品的布尔变量，如</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">milk</span>, <span style="font-size: 9pt; color: teal; font-family: 新宋体">soy</span><span style="font-family: 宋体">等，然后提供了一些</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">has(get)</span><span style="font-family: 宋体">和</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">set</span><span style="font-family: 宋体">方法来设置这些布尔值；其次在</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Beverage</span><span style="font-family: 宋体">类里实现</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">方法来计算调味品的价钱。所有咖啡子类将仍然覆盖</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">方法，只是这次它们需要同时调用基类的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">方法，以便获得咖啡加上调味品后的总价。</span>&nbsp;&nbsp;
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">看上去似乎这是一个不错的设计，那么下面我们再来给</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Beverage</span><span style="font-family: 宋体">增加子类，如下图所示：</span></p>
<p style="margin: 0cm 0cm 0pt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center"><img height="369" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator4.jpg" width="553" border="0" />&nbsp;</div>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">基类的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">方法将计算所有调味品的价钱</span>(<span style="font-family: 宋体">当然是只包括布尔值为</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">true</span><span style="font-family: 宋体">的调味品</span>)<span style="font-family: 宋体">，子类里的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">cost()</span><span style="font-family: 宋体">方法将扩展其功能，以包含特定类型饮料的价钱。</span></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK! <span style="font-family: 宋体">现在我们似乎已经有了一个看上去还不错的设计，那么</span>Central Perk<span style="font-family: 宋体">的这个记账系统就按这个设计来实现就万事大吉了吗？等一下，还是让我们先从以前学习过的&#8220;<span style="color: red">找到系统中变化的部分，将变化的部分同其它稳定的部分隔开。</span>&#8221;这个设计原则出发，重新推敲一下这个设计。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">那么对于一家咖啡店来说，都有那些变化点呢？调味品的品种和价格会变吗？咖啡的品种和价格会变吗？咖啡和调味品的组合方式会变吗？</span><strong>YES!</strong><span style="font-family: 宋体">对于一家咖啡店来说，这些方面肯定会经常发生改变的！那么，当这些改变发生的时候，我们的记账系统要如何应对呢？</span> <span style="font-family: 宋体">如果调味品发生改变，那么我们只能从代码的层次重新调整</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Beverage</span><span style="font-family: 宋体">基类，这太糟糕了；如果咖啡发生改变，我们可以增加或删除一个子类即可，这个似乎还可以忍受；那么咖啡和调味品的组合方式发生改变呢？如果顾客点了一杯纯黑咖啡外加两份砂糖和一份巧克力，或者顾客点了一杯脱咖啡因咖啡</span>(<span style="font-size: 9pt; color: teal; font-family: 新宋体">Decaf</span>)<span style="font-family: 宋体">外加三份炼乳和一份砂糖呢？我倒！突然意识到，上面的设计根本不支持组合一份以上同种调味品的情况，因为基类里的布尔值只能记录是否包含某种调味品，而并不能表示包含几份，连基本的功能需求都没有满足，看来这些开发者可以卷铺盖滚蛋了！</span><span style="font-size: 9pt; color: red">(</span><span style="font-size: 9pt; color: red; font-family: 宋体">似乎他们改行去做炸弹更合适！</span><span style="font-size: 9pt; color: red">)</span></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">好吧！让我们来接手这个设计！我们已经分析了前面设计的失败之处，我们应该实现支持调味品的品种和价格任意改变而不需要修改已有代码的设计；我们还要实现支持咖啡品种和价格任意改变而不需要修改已有代码的设计</span>(<span style="font-family: 宋体">这点上面的设计通过继承算是实现了</span>)<span style="font-family: 宋体">；还有就是支持咖啡和调味品的品种和份数任意组合而不需要修改已有代码的设计；还有就是代码重用越多越好了，内聚越高越好了，耦合越低越好了；</span><span style="font-size: 9pt; color: red">(</span><span style="font-size: 9pt; color: red; font-family: 宋体">还有最重要的，报酬越高越好啦！</span><span style="font-size: 9pt; color: red">)</span></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">看来我们要实现的目标还真不少，那么我们到底该怎么做呢？说实话，我现在也不知道！我们需要先去拜访一下今天的主角—装饰者模式，看看她能给我们带来什么惊喜吧！</span></p>
<h3 style="margin: 13pt 0cm"><span style="font-family: 宋体"><font size="5">这就是装饰者模式</font></span></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们还是先看一下官方的定义：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><strong><span style="color: red">The Decorator Pattern</span></strong><span style="color: red"> attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.</span> (<span style="font-family: 宋体">装饰者模式可以动态地给一个对象增加其他职责。就扩展对象功能来说，装饰者模式比生成子类更为灵活。</span>)</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">这里我们要重点注意那个</span>dynamically<span style="font-family: 宋体">（动态的），什么是动态？静态又是什么？这是我们要重点区分的地方，后面我们还会专门讨论这个问题。下面先看看装饰者模式的类图和顺序图：</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span>
<div align="center"><img height="278" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator5.gif" width="554" border="0" /></div>
Component</span></strong><strong><span style="font-family: 宋体">（被装饰对象基类）</span></strong>&nbsp;&nbsp;
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">定义对象的接口，可以给这些对象动态增加职责；</span></p>
<p style="margin: 0cm 0cm 0pt"><strong>ConcreteComponent</strong><strong><span style="font-family: 宋体">（具体被装饰对象）</span></strong></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">定义具体的对象，</span>Decorator<span style="font-family: 宋体">可以给它增加额外的职责；</span> </p>
<p style="margin: 0cm 0cm 0pt"><strong>Decorator</strong><strong><span style="font-family: 宋体">（装饰者抽象类）</span></strong></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: red; font-family: 宋体">维护一个指向</span><span style="color: red">Component</span><span style="color: red; font-family: 宋体">实例的引用</span><span style="font-family: 宋体">，并且定义了与</span>Component<span style="font-family: 宋体">一致的接口；</span> </p>
<p style="margin: 0cm 0cm 0pt"><strong>ConcreteDecorator</strong><strong><span style="font-family: 宋体">（具体装饰者）</span></strong></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">具体的装饰对象，<span style="color: red">给内部持有的具体被装饰对象增加具体的职责；</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span><span>
<div align="center"><img height="280" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator6.gif" width="543" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">怎么样？大家都看懂了吧</span>!<span style="font-family: 宋体">看懂了我就不解释了！—</span> <span style="font-family: 宋体">呵呵，开玩笑的！</span>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们先来说说上面提到的动态和静态的问题，所谓动态是说可以在系统运行时</span>(RunTime)<span style="font-family: 宋体">动态给对象增加其它职责而不需要修改代码或重新编译；所谓静态是说必须通过调整代码</span>(DesignTime)<span style="font-family: 宋体">才能给对象增加职责</span>,<span style="font-family: 宋体">而且系统还需要重新编译；从具体技术层面来说，对象的组合和继承正好对应于前面的动态和静态，因为通过对象组合建立的交互关系不是在代码中</span>(DesignTime)<span style="font-family: 宋体">固定死的，而是在运行时</span>(RunTime)<span style="font-family: 宋体">动态组合的；而通过继承建立的关系是僵硬的难以改变的，因为它是在代码中</span>(DesignTime)<span style="font-family: 宋体">固定死了的，根本不存在运行时</span>(RunTime)<span style="font-family: 宋体">改变的可能。换个角度说：我们应该多使用对象组合来保持系统的运行时扩展性，尽量少使用继续，因为继承让程序变得僵硬！这句话听着是不是很熟悉啊？恩！这就是我们前面文章里提过多次的一个设计原则：</span><strong><span style="color: red">Favor composition over inheritance.</span></strong><span style="font-family: 宋体">（优先使用对象组合，而非类继承），更多的就不需要再解释了吧？</span></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">那么回到装饰者模式，跟前面介绍过的模式一样，装饰者同样是一个很简单的模式，特别是画出类图和顺序图之后，一切都很清楚明了。这里只有一个地方需要特殊强调一下：</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Decorator</span><span style="font-family: 宋体">是装饰者模式里非常特殊的一个类，它既继承于</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">【</span>IS A<span style="font-family: 宋体">关系】</span>,<span style="font-family: 宋体">又维护一个指向</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">实例的引用【</span>HAS A<span style="font-family: 宋体">关系】，换个角度来说，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Decorator</span><span style="font-family: 宋体">跟</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">之间，既有动态组合关系又有静态继承关系，</span><strong>WHY? </strong><span style="font-family: 宋体">这里为什么要这么来设计？上面我们说过，组合的好处是可以在运行时给对象增加职责，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Decorator</span><span style="font-family: 宋体">【</span>HAS A<span style="font-family: 宋体">】</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">的目的是让</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteDecorator</span><span style="font-family: 宋体">可以在运行时动态给</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteComponent</span><span style="font-family: 宋体">增加职责，这一点相对来说还比较好理解；那么</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Decorator</span><span style="font-family: 宋体">继承于</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">的目的是什么？在这里，继承的目的<strong><span style="color: red">只有一个</span></strong>，那就是可以统一装饰者和被装饰者的接口，换个角度来说，不管是</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcretComponent</span><span style="font-family: 宋体">还是</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteDecorator</span><span style="font-family: 宋体">，它们都是</span> <span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">，用户代码可以把它们统一看作</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">来处理，这样带来的更深一层的好处就是，装饰者对象对被装饰者对象的功能职责扩展对用户代码来说是<strong><span style="color: red">完全透明</span></strong>的，因为用户代码引用的都是</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">，所以就不会因为被装饰者对象在被装饰后，引用它的用户代码发生错误，实际上不会有任何影响，因为装饰前后，用户代码引用的都是</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span><span style="font-family: 宋体">类型的对象，这真是太完美了！装饰者模式通过继承实现统一了装饰者和被装饰者的接口，通过组合获得了在运行时动态扩展被装饰者对象的能力。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们再举个生活中的例子，俗话说&#8220;人在衣着马在鞍&#8221;，把这就话用装饰者模式的语境翻译一下，&#8220;人通过漂亮的衣服装饰后，男人变帅了，女人变漂亮了；&#8221;。对应上面的类图，这里人对应于</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteComponent</span>,<span style="font-family: 宋体">而漂亮衣服则对应于</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteDecorator</span><span style="font-family: 宋体">；换个角度来说，人和漂亮衣服组合在一起【</span>HAS A<span style="font-family: 宋体">】，有了帅哥或美女，但是他们还是人【</span>IS A<span style="font-family: 宋体">】，还要做人该做的事情，但是可能会对异性更有吸引力了</span>(<span style="font-family: 宋体">扩展功能</span>)<span style="font-family: 宋体">！</span>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">现在我们已经认识了装饰者模式，知道了动态关系和静态关系是怎么回事，是时候该解决咖啡店的问题了，从装饰者模式的角度来考虑问题，咖啡和调味品的关系应该是：咖啡是被装饰对象而调味品是装饰者，咖啡和调味品可以任意组合，但是不管怎么组合，咖啡还是咖啡！原来这么简单啊！具体看下面的类图：</span></p>
<p style="margin: 0cm 0cm 0pt"><span><span>
<div align="center"><img height="394" alt="" src="http://www.cnblogs.com/images/cnblogs_com/justinw/decorator7.jpg" width="553" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如图所示，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Beverage</span><span style="font-family: 宋体">还是所有饮料的基类，它对应于装饰者模式类图里的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Component</span>,<span style="font-family: 宋体">是所有被装饰对象的基类；</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">HouseBlend</span>, <span style="font-size: 9pt; color: teal; font-family: 新宋体">DarkRoast</span>, <span style="font-size: 9pt; color: teal; font-family: 新宋体">Espresso</span>, <span style="font-size: 9pt; color: teal; font-family: 新宋体">Decaf</span><span style="font-family: 宋体">是具体的饮料</span>(<span style="font-family: 宋体">咖啡</span>)<span style="font-family: 宋体">种类，对应于前面的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteComponent</span><span style="font-family: 宋体">，即是具体的被装饰对象；</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">CondimentDecorator</span><span style="font-family: 宋体">对应于前面的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Decorator</span><span style="font-family: 宋体">，是装饰者的抽象类；而</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Milk</span><span style="font-family: 宋体">，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Mocha</span><span style="font-family: 宋体">，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Soy</span><span style="font-family: 宋体">，</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">Whip</span><span style="font-family: 宋体">则都是具体的调味品，对于前面的</span><span style="font-size: 9pt; color: teal; font-family: 新宋体">ConcreteDecorator</span><span style="font-family: 宋体">，也就是具体的装饰者。下面我们通过具体的代码再进一步理解一下基于装饰者模式的记账系统的实现。</span>&nbsp;</span></span>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-25 10:06 <a href="http://www.blogjava.net/supercrsky/articles/202691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习装饰者模式(Decorator)</title><link>http://www.blogjava.net/supercrsky/articles/202690.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sun, 25 May 2008 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202690.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202690.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202690.html</trackback:ping><description><![CDATA[<p>1、定义及作用</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该模式以对客户端透明的方式扩展对象的功能。</p>
<p>2、涉及角色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象构件角色：定义一个抽象接口，来规范准备附加功能的类。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体构件角色：将要被附加功能的类，实现抽象构件角色接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象装饰者角色：持有对具体构件角色的引用并定义与抽象构件角色一致的接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体装饰角色：实现抽象装饰者角色，负责为具体构件添加额外功能。</p>
<p>&nbsp; <br />
&nbsp; 3、简单实现 <br />
抽象构件角色java 代码:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.decorator2;<br />
<img id="Codehighlighter1_32_66_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_66_Open_Text.style.display='none'; Codehighlighter1_32_66_Closed_Image.style.display='inline'; Codehighlighter1_32_66_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_66_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_66_Closed_Text.style.display='none'; Codehighlighter1_32_66_Open_Image.style.display='inline'; Codehighlighter1_32_66_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_32_66_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">/**&nbsp;*/</span><span id="Codehighlighter1_32_66_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;抽象构件角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_95_125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_95_125_Open_Text.style.display='none'; Codehighlighter1_95_125_Closed_Image.style.display='inline'; Codehighlighter1_95_125_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_95_125_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_95_125_Closed_Text.style.display='none'; Codehighlighter1_95_125_Open_Image.style.display='inline'; Codehighlighter1_95_125_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_95_125_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"  alt="" /></span><span id="Codehighlighter1_95_125_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">默认方法A</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;functionA();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.decorator2;<br />
<img id="Codehighlighter1_32_66_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_66_Open_Text.style.display='none'; Codehighlighter1_32_66_Closed_Image.style.display='inline'; Codehighlighter1_32_66_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_66_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_66_Closed_Text.style.display='none'; Codehighlighter1_32_66_Open_Image.style.display='inline'; Codehighlighter1_32_66_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_32_66_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">/**&nbsp;*/</span><span id="Codehighlighter1_32_66_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;具体构件角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateComponent&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_121_193_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_193_Open_Text.style.display='none'; Codehighlighter1_121_193_Closed_Image.style.display='inline'; Codehighlighter1_121_193_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_121_193_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_121_193_Closed_Text.style.display='none'; Codehighlighter1_121_193_Open_Image.style.display='inline'; Codehighlighter1_121_193_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_121_193_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"  alt="" /></span><span id="Codehighlighter1_121_193_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;functionA()<br />
<img id="Codehighlighter1_151_190_Open_Image" onclick="this.style.display='none'; Codehighlighter1_151_190_Open_Text.style.display='none'; Codehighlighter1_151_190_Closed_Image.style.display='inline'; Codehighlighter1_151_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_151_190_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_151_190_Closed_Text.style.display='none'; Codehighlighter1_151_190_Open_Image.style.display='inline'; Codehighlighter1_151_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_151_190_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"  alt="" /></span><span id="Codehighlighter1_151_190_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Function&nbsp;A</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.decorator2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_33_73_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_73_Open_Text.style.display='none'; Codehighlighter1_33_73_Closed_Image.style.display='inline'; Codehighlighter1_33_73_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_33_73_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_33_73_Closed_Text.style.display='none'; Codehighlighter1_33_73_Open_Image.style.display='inline'; Codehighlighter1_33_73_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_33_73_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">/**&nbsp;*/</span><span id="Codehighlighter1_33_73_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;抽象装饰者角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Decorator&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_119_299_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_299_Open_Text.style.display='none'; Codehighlighter1_119_299_Closed_Image.style.display='inline'; Codehighlighter1_119_299_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_119_299_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_119_299_Closed_Text.style.display='none'; Codehighlighter1_119_299_Open_Image.style.display='inline'; Codehighlighter1_119_299_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_119_299_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"  alt="" /></span><span id="Codehighlighter1_119_299_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">抽象构件角色的引用</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Component&nbsp;component;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Decorator(Component&nbsp;component)<br />
<img id="Codehighlighter1_206_239_Open_Image" onclick="this.style.display='none'; Codehighlighter1_206_239_Open_Text.style.display='none'; Codehighlighter1_206_239_Closed_Image.style.display='inline'; Codehighlighter1_206_239_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_206_239_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_206_239_Closed_Text.style.display='none'; Codehighlighter1_206_239_Open_Image.style.display='inline'; Codehighlighter1_206_239_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_206_239_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"  alt="" /></span><span id="Codehighlighter1_206_239_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.component&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;component;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;functionA()<br />
<img id="Codehighlighter1_268_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_268_296_Open_Text.style.display='none'; Codehighlighter1_268_296_Closed_Image.style.display='inline'; Codehighlighter1_268_296_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_268_296_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_268_296_Closed_Text.style.display='none'; Codehighlighter1_268_296_Open_Image.style.display='inline'; Codehighlighter1_268_296_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_268_296_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"  alt="" /></span><span id="Codehighlighter1_268_296_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.functionA();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
具体装饰者角色1:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.decorator2;<br />
<img id="Codehighlighter1_32_67_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_67_Open_Text.style.display='none'; Codehighlighter1_32_67_Closed_Image.style.display='inline'; Codehighlighter1_32_67_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_67_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_67_Closed_Text.style.display='none'; Codehighlighter1_32_67_Open_Image.style.display='inline'; Codehighlighter1_32_67_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_32_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">/**&nbsp;*/</span><span id="Codehighlighter1_32_67_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;具体装饰者角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateDecorator1&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Decorator<br />
<img id="Codehighlighter1_120_362_Open_Image" onclick="this.style.display='none'; Codehighlighter1_120_362_Open_Text.style.display='none'; Codehighlighter1_120_362_Closed_Image.style.display='inline'; Codehighlighter1_120_362_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_120_362_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_120_362_Closed_Text.style.display='none'; Codehighlighter1_120_362_Open_Image.style.display='inline'; Codehighlighter1_120_362_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_120_362_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"  alt="" /></span><span id="Codehighlighter1_120_362_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ConcreateDecorator1(Component&nbsp;component)<br />
<img id="Codehighlighter1_172_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_195_Open_Text.style.display='none'; Codehighlighter1_172_195_Closed_Image.style.display='inline'; Codehighlighter1_172_195_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_172_195_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_172_195_Closed_Text.style.display='none'; Codehighlighter1_172_195_Open_Image.style.display='inline'; Codehighlighter1_172_195_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_172_195_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"  alt="" /></span><span id="Codehighlighter1_172_195_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(component);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;functionA()<br />
<img id="Codehighlighter1_235_279_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_279_Open_Text.style.display='none'; Codehighlighter1_235_279_Closed_Image.style.display='inline'; Codehighlighter1_235_279_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_235_279_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_279_Closed_Text.style.display='none'; Codehighlighter1_235_279_Open_Image.style.display='inline'; Codehighlighter1_235_279_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_235_279_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"  alt="" /></span><span id="Codehighlighter1_235_279_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.functionA();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.functionB();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">根据自己的需要扩展</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;functionB()<br />
<img id="Codehighlighter1_321_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_321_360_Open_Text.style.display='none'; Codehighlighter1_321_360_Closed_Image.style.display='inline'; Codehighlighter1_321_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_321_360_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_321_360_Closed_Text.style.display='none'; Codehighlighter1_321_360_Open_Image.style.display='inline'; Codehighlighter1_321_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_321_360_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"  alt="" /></span><span id="Codehighlighter1_321_360_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">function&nbsp;B</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
具体装饰者角色2:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.decorator2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateDecorator&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Decorator<br />
<img id="Codehighlighter1_83_312_Open_Image" onclick="this.style.display='none'; Codehighlighter1_83_312_Open_Text.style.display='none'; Codehighlighter1_83_312_Closed_Image.style.display='inline'; Codehighlighter1_83_312_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_83_312_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_83_312_Closed_Text.style.display='none'; Codehighlighter1_83_312_Open_Image.style.display='inline'; Codehighlighter1_83_312_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_83_312_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"  alt="" /></span><span id="Codehighlighter1_83_312_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ConcreateDecorator(Component&nbsp;component)<br />
<img id="Codehighlighter1_134_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_157_Open_Text.style.display='none'; Codehighlighter1_134_157_Closed_Image.style.display='inline'; Codehighlighter1_134_157_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_134_157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_134_157_Closed_Text.style.display='none'; Codehighlighter1_134_157_Open_Image.style.display='inline'; Codehighlighter1_134_157_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_134_157_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"  alt="" /></span><span id="Codehighlighter1_134_157_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(component);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;functionA()<br />
<img id="Codehighlighter1_197_241_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_241_Open_Text.style.display='none'; Codehighlighter1_197_241_Closed_Image.style.display='inline'; Codehighlighter1_197_241_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_197_241_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_241_Closed_Text.style.display='none'; Codehighlighter1_197_241_Open_Image.style.display='inline'; Codehighlighter1_197_241_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_197_241_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"  alt="" /></span><span id="Codehighlighter1_197_241_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.functionA();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.functionC();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;functionC()<br />
<img id="Codehighlighter1_271_310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_271_310_Open_Text.style.display='none'; Codehighlighter1_271_310_Closed_Image.style.display='inline'; Codehighlighter1_271_310_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_271_310_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_271_310_Closed_Text.style.display='none'; Codehighlighter1_271_310_Open_Image.style.display='inline'; Codehighlighter1_271_310_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_271_310_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"  alt="" /></span><span id="Codehighlighter1_271_310_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">fucntion&nbsp;C</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.decorator2;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_33_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_71_Open_Text.style.display='none'; Codehighlighter1_33_71_Closed_Image.style.display='inline'; Codehighlighter1_33_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_33_71_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_33_71_Closed_Text.style.display='none'; Codehighlighter1_33_71_Open_Image.style.display='inline'; Codehighlighter1_33_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_33_71_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">/**&nbsp;*/</span><span id="Codehighlighter1_33_71_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;测试客户端<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
<img id="Codehighlighter1_93_316_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_316_Open_Text.style.display='none'; Codehighlighter1_93_316_Closed_Image.style.display='inline'; Codehighlighter1_93_316_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_93_316_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_93_316_Closed_Text.style.display='none'; Codehighlighter1_93_316_Open_Image.style.display='inline'; Codehighlighter1_93_316_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_93_316_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"  alt="" /></span><span id="Codehighlighter1_93_316_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_97_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_97_120_Open_Text.style.display='none'; Codehighlighter1_97_120_Closed_Image.style.display='inline'; Codehighlighter1_97_120_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_97_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_97_120_Closed_Text.style.display='none'; Codehighlighter1_97_120_Open_Image.style.display='inline'; Codehighlighter1_97_120_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_97_120_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">/**&nbsp;*/</span><span id="Codehighlighter1_97_120_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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)<br />
<img id="Codehighlighter1_163_313_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_313_Open_Text.style.display='none'; Codehighlighter1_163_313_Closed_Image.style.display='inline'; Codehighlighter1_163_313_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_163_313_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_313_Closed_Text.style.display='none'; Codehighlighter1_163_313_Open_Image.style.display='inline'; Codehighlighter1_163_313_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_163_313_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"  alt="" /></span><span id="Codehighlighter1_163_313_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;一层套一层，进行方法组合</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;component&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateDecorator(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateDecorator1(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreateComponent()));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.functionA();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<p>OO原则：动态地将责任附加到对象上。想要扩展功能，装饰者提供有别于继承的另一种选择。 </p>
<p>要点： <br />
1、继承属于扩展形式之一，但不见得是达到弹性设计的最佳方案。 <br />
2、在我们的设计中，应该允许行为可以被扩展，而不须修改现有的代码。 <br />
3、组合和委托可用于在运行时动态地加上新的行为。 <br />
4、除了继承，装饰者模式也可以让我们扩展行为。 <br />
5、装饰者模式意味着一群装饰者类，这些类用来包装具体组件。 <br />
6、装饰者类反映出被装饰的组件类型（实际上，他们具有相同的类型，都经过接口或继承实现）。 <br />
7、装饰者可以在被装饰者的行为前面与/或后面加上自己的行为，甚至将被装饰者的行为整个取代掉，而达到特定的目的。 <br />
8、你可以有无所数个装饰者包装一个组件。 <br />
9、装饰者一般对组建的客户是透明的，除非客户程序依赖于组件的具体类型。 <br />
10、装饰者会导致设计中出现许多的小对象，如果过度使用，会让程序变得很复杂。 </p>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-25 09:58 <a href="http://www.blogjava.net/supercrsky/articles/202690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java　观察者模式的浅析</title><link>http://www.blogjava.net/supercrsky/articles/202544.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sat, 24 May 2008 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202544.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202544.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202544.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 简单地说，观察者模式定义了一个一对多的依赖关系，让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象，使这些观察者对象能够自动更新。　　观察者模式的结构　　观察者（Observer）模式是对象的行为型模式，又叫做发表-订阅（Publish/Subscribe）模式、模型-视图（Model/View）模式、源-收听者（Sou...&nbsp;&nbsp;<a href='http://www.blogjava.net/supercrsky/articles/202544.html'>阅读全文</a><img src ="http://www.blogjava.net/supercrsky/aggbug/202544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-24 10:13 <a href="http://www.blogjava.net/supercrsky/articles/202544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Deafult Adapter的学习</title><link>http://www.blogjava.net/supercrsky/articles/202532.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sat, 24 May 2008 00:35:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202532.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202532.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202532.html</trackback:ping><description><![CDATA[<h4>一、概述</h4>
<p>当不需要全部实现适配器接口提供的方法时，可先设计一个抽象类实现适配器接口，并为接口中每个方法提供一个默认实现（空方法）。那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。</p>
<h4>二、结构</h4>
<p align="center"><img height="243" alt="defaultadapter.png" src="http://www.blogjava.net/images/blogjava_net/fidodido/2507/defaultadapter.png" width="138" border="0" /></p>
<h4>&nbsp;</h4>
<h4>三、动机</h4>
<p>对于一个接口不想使用其所有的方法时。<br />
<br />
<br />
<font face="Arial"><font face="Arial">我觉得把<span class="hilite1"><span class="hilite1">Default</span></span> <span class="hilite2"><span class="hilite2">Adapter模式</span></span>和<span class="hilite2"><span class="hilite2">Adapter模式</span></span>割裂开来，不会影响对<span class="hilite1"><span class="hilite1">Default</span></span> <span class="hilite2"><span class="hilite2">Adapter模式</span></span>的理解。<br />
<span class="hilite1"><span class="hilite1">Default</span></span> <span class="hilite2"><span class="hilite2">Adapter模式</span></span>就是为目标接口提供一个平庸实现层，真正的实现类从此平庸实现层继承，Override其中对自己有意义的方法，而其他方法保持其平庸状态。<br />
为Target接口所需的方法统统提供一套缺省实现，通常的做法是，除非你特别要求，否则我什么都不做。<br />
如果实现类比较多而且需要实现的方法很多、真正做事儿的方法很少，那么<span class="hilite1"><span class="hilite1">Default</span></span> <span class="hilite2"><span class="hilite2">Adapter模式</span></span>会为系统省下不少重复代码。</font></font> <br />
<br />
<strong>缺省适配器模式</strong>：为一个接口提供缺省实现，这样子类型可以从这个缺省实现进行扩展，而不必从原有接口进行扩展。<br />
&#8220;平庸化&#8221;的适配器模式。<br />
</p>
<br />
简单实现一下:<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com_pattern_deafultadapter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_37_79_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_79_Open_Text.style.display='none'; Codehighlighter1_37_79_Closed_Image.style.display='inline'; Codehighlighter1_37_79_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_79_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_79_Closed_Text.style.display='none'; Codehighlighter1_37_79_Open_Image.style.display='inline'; Codehighlighter1_37_79_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_37_79_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">/**&nbsp;*/</span><span id="Codehighlighter1_37_79_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;接口(提供一些要使用的方法)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;AbstraceService<br />
<img id="Codehighlighter1_114_190_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_190_Open_Text.style.display='none'; Codehighlighter1_114_190_Closed_Image.style.display='inline'; Codehighlighter1_114_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_114_190_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_114_190_Closed_Text.style.display='none'; Codehighlighter1_114_190_Open_Image.style.display='inline'; Codehighlighter1_114_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_114_190_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"  alt="" /></span><span id="Codehighlighter1_114_190_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;method1();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;method2();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;mehtod3();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com_pattern_deafultadapter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_37_153_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_153_Open_Text.style.display='none'; Codehighlighter1_37_153_Closed_Image.style.display='inline'; Codehighlighter1_37_153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_153_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_153_Closed_Text.style.display='none'; Codehighlighter1_37_153_Open_Image.style.display='inline'; Codehighlighter1_37_153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_37_153_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">/**&nbsp;*/</span><span id="Codehighlighter1_37_153_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">*****************************************************************************<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;缺省适配器类<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ServiceAdaper&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;AbstraceService<br />
<img id="Codehighlighter1_209_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_209_300_Open_Text.style.display='none'; Codehighlighter1_209_300_Closed_Image.style.display='inline'; Codehighlighter1_209_300_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_209_300_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_209_300_Closed_Text.style.display='none'; Codehighlighter1_209_300_Open_Image.style.display='inline'; Codehighlighter1_209_300_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_209_300_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"  alt="" /></span><span id="Codehighlighter1_209_300_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;method1()<br />
<img id="Codehighlighter1_235_238_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_238_Open_Text.style.display='none'; Codehighlighter1_235_238_Closed_Image.style.display='inline'; Codehighlighter1_235_238_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_235_238_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_238_Closed_Text.style.display='none'; Codehighlighter1_235_238_Open_Image.style.display='inline'; Codehighlighter1_235_238_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_235_238_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"  alt="" /></span><span id="Codehighlighter1_235_238_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;method2()<br />
<img id="Codehighlighter1_265_268_Open_Image" onclick="this.style.display='none'; Codehighlighter1_265_268_Open_Text.style.display='none'; Codehighlighter1_265_268_Closed_Image.style.display='inline'; Codehighlighter1_265_268_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_265_268_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_265_268_Closed_Text.style.display='none'; Codehighlighter1_265_268_Open_Image.style.display='inline'; Codehighlighter1_265_268_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_265_268_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"  alt="" /></span><span id="Codehighlighter1_265_268_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;mehtod3()<br />
<img id="Codehighlighter1_295_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_295_298_Open_Text.style.display='none'; Codehighlighter1_295_298_Closed_Image.style.display='inline'; Codehighlighter1_295_298_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_295_298_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_295_298_Closed_Text.style.display='none'; Codehighlighter1_295_298_Open_Image.style.display='inline'; Codehighlighter1_295_298_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_295_298_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"  alt="" /></span><span id="Codehighlighter1_295_298_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com_pattern_deafultadapter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_37_156_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_156_Open_Text.style.display='none'; Codehighlighter1_37_156_Closed_Image.style.display='inline'; Codehighlighter1_37_156_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_156_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_156_Closed_Text.style.display='none'; Codehighlighter1_37_156_Open_Image.style.display='inline'; Codehighlighter1_37_156_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_37_156_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">/**&nbsp;*/</span><span id="Codehighlighter1_37_156_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">*****************************************************************************<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;真正要使用方法的类<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreateService&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ServiceAdaper<br />
<img id="Codehighlighter1_210_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_210_266_Open_Text.style.display='none'; Codehighlighter1_210_266_Closed_Image.style.display='inline'; Codehighlighter1_210_266_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_210_266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_210_266_Closed_Text.style.display='none'; Codehighlighter1_210_266_Open_Image.style.display='inline'; Codehighlighter1_210_266_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_210_266_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"  alt="" /></span><span id="Codehighlighter1_210_266_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;重写自己需要的方法</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;method1()<br />
<img id="Codehighlighter1_261_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_261_264_Open_Text.style.display='none'; Codehighlighter1_261_264_Closed_Image.style.display='inline'; Codehighlighter1_261_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_261_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_261_264_Closed_Text.style.display='none'; Codehighlighter1_261_264_Open_Image.style.display='inline'; Codehighlighter1_261_264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_261_264_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_261_264_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-24 08:35 <a href="http://www.blogjava.net/supercrsky/articles/202532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Builder设计模式的学习</title><link>http://www.blogjava.net/supercrsky/articles/202450.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Fri, 23 May 2008 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202450.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202450.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202450.html</trackback:ping><description><![CDATA[&nbsp;对于<span class="hilite2"><span class="hilite2">Builder模式</span></span>很简单，但是一直想不明白为什么要这么设计，为什么要向builder要Product而不是向知道建造过程的Director要。刚才google到一篇文章，总算清楚了。在这里转贴一下这位<a href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=125&amp;threadID=28019&amp;messageID=241582">richardluo的比喻</a>。<br />
<br />
<strong>简单地说，就好象我要一座房子住，可是我不知道怎么盖（简单的砌墙，层次较低），也不知道怎么样设计（建几个房间，几个门好看，层次较高），于是我需要找一帮<font color="#ff0000">民工，他们会砌墙</font>，还得找个<font color="#ff0000">设计师，他知道怎么设计</font>，我还要确保<font color="#ff0000">民工听设计师的领导</font>，而设计师本身也不干活，光是下命令，这里砌一堵墙，这里砌一扇门，这样民工开始建设，最后，我可以向民工要房子了。在这个过程中，<font color="#ff0000">设计师是什么也没有，除了他在脑子里的设计和命令，所以要房子也是跟民工要</font>，记住了！</strong><br />
<br />
以下是richardluo的代码，我根据他的思路加上了相应的注释。<br />
<br />
<strong>1，定义工人接口</strong>，就是能够完成建造房子任务的人的通用要求。<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;工人接口，定义了各个工人所要进行的工所作。他们负责进行具体部件如窗户，地板的建造。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;同时因为房子是民工建的，因此建设完成后由他把房子递交回房主</span><span style="color: #008000"><br />
<img id="Codehighlighter1_114_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_234_Open_Text.style.display='none'; Codehighlighter1_114_234_Closed_Image.style.display='inline'; Codehighlighter1_114_234_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_114_234_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_114_234_Closed_Text.style.display='none'; Codehighlighter1_114_234_Open_Image.style.display='inline'; Codehighlighter1_114_234_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Builder&nbsp;</span><span id="Codehighlighter1_114_234_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"  alt="" /></span><span id="Codehighlighter1_114_234_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;makeWindow();&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;makeFloor();&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;Room&nbsp;&nbsp;getRoom();&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<strong>2，定义设计师</strong>，他的职责是指挥房主指派给他的工人按照自己的设计意图建造房子。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设计师。他知道房子应该怎么设计，但他不会自己去建造，而是指挥民工去建造。&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_71_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_220_Open_Text.style.display='none'; Codehighlighter1_71_220_Closed_Image.style.display='inline'; Codehighlighter1_71_220_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_71_220_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_71_220_Closed_Text.style.display='none'; Codehighlighter1_71_220_Open_Image.style.display='inline'; Codehighlighter1_71_220_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></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">class</span><span style="color: #000000">&nbsp;Designer&nbsp;</span><span id="Codehighlighter1_71_220_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"  alt="" /></span><span id="Codehighlighter1_71_220_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;指挥民工进行工作&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_144_212_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_212_Open_Text.style.display='none'; Codehighlighter1_144_212_Closed_Image.style.display='inline'; Codehighlighter1_144_212_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_144_212_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_144_212_Closed_Text.style.display='none'; Codehighlighter1_144_212_Open_Image.style.display='inline'; Codehighlighter1_144_212_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&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;order(Builder&nbsp;&nbsp;builder)&nbsp;</span><span id="Codehighlighter1_144_212_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"  alt="" /></span><span id="Codehighlighter1_144_212_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.makeWindow();&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.makeFloor();&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<strong>3，民工</strong>，他负责具体事物的实施。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;民工。负责进行具体部件如窗户，地板的建造。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">同时因为房子是民工建的，因此建设完成后由他把房子递交回房主&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_113_596_Open_Image" onclick="this.style.display='none'; Codehighlighter1_113_596_Open_Text.style.display='none'; Codehighlighter1_113_596_Closed_Image.style.display='inline'; Codehighlighter1_113_596_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_113_596_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_113_596_Closed_Text.style.display='none'; Codehighlighter1_113_596_Open_Image.style.display='inline'; Codehighlighter1_113_596_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></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">class</span><span style="color: #000000">&nbsp;Mingong&nbsp;&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Builder&nbsp;</span><span id="Codehighlighter1_113_596_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"  alt="" /></span><span id="Codehighlighter1_113_596_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;window</span><span style="color: #000000">=</span><span style="color: #000000">""</span><span style="color: #000000">;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;floor</span><span style="color: #000000">=</span><span style="color: #000000">""</span><span style="color: #000000">;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_225_270_Open_Image" onclick="this.style.display='none'; Codehighlighter1_225_270_Open_Text.style.display='none'; Codehighlighter1_225_270_Closed_Image.style.display='inline'; Codehighlighter1_225_270_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_225_270_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_225_270_Closed_Text.style.display='none'; Codehighlighter1_225_270_Open_Image.style.display='inline'; Codehighlighter1_225_270_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;makeWindow()&nbsp;</span><span id="Codehighlighter1_225_270_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"  alt="" /></span><span id="Codehighlighter1_225_270_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">window</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_309_354_Open_Image" onclick="this.style.display='none'; Codehighlighter1_309_354_Open_Text.style.display='none'; Codehighlighter1_309_354_Closed_Image.style.display='inline'; Codehighlighter1_309_354_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_309_354_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_309_354_Closed_Text.style.display='none'; Codehighlighter1_309_354_Open_Image.style.display='inline'; Codehighlighter1_309_354_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;makeFloor()</span><span id="Codehighlighter1_309_354_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"  alt="" /></span><span id="Codehighlighter1_309_354_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;floor</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">floor</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;回交房子给房主&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_411_590_Open_Image" onclick="this.style.display='none'; Codehighlighter1_411_590_Open_Text.style.display='none'; Codehighlighter1_411_590_Closed_Image.style.display='inline'; Codehighlighter1_411_590_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_411_590_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_411_590_Closed_Text.style.display='none'; Codehighlighter1_411_590_Open_Image.style.display='inline'; Codehighlighter1_411_590_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;Room&nbsp;&nbsp;getRoom()&nbsp;</span><span id="Codehighlighter1_411_590_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"  alt="" /></span><span id="Codehighlighter1_411_590_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img id="Codehighlighter1_468_554_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_554_Open_Text.style.display='none'; Codehighlighter1_468_554_Closed_Image.style.display='inline'; Codehighlighter1_468_554_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_468_554_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_468_554_Closed_Text.style.display='none'; Codehighlighter1_468_554_Open_Image.style.display='inline'; Codehighlighter1_468_554_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">((</span><span style="color: #000000">!</span><span style="color: #000000">window.equals(</span><span style="color: #000000">""</span><span style="color: #000000">))</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">floor.equals(</span><span style="color: #000000">""</span><span style="color: #000000">)))&nbsp;</span><span id="Codehighlighter1_468_554_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"  alt="" /></span><span id="Codehighlighter1_468_554_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">room&nbsp;ready!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Room();&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<strong>4，房主</strong>，就是雇人，收房。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;房主。房主的任务就是聘请一个民工，一个设计师，同时把民工给设计师指挥，督促设计师开展工作。最后从民工手上收房。&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_85_310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_310_Open_Text.style.display='none'; Codehighlighter1_85_310_Closed_Image.style.display='inline'; Codehighlighter1_85_310_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_85_310_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_85_310_Closed_Text.style.display='none'; Codehighlighter1_85_310_Open_Image.style.display='inline'; Codehighlighter1_85_310_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></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 style="color: #000000">&nbsp;Client&nbsp;</span><span id="Codehighlighter1_85_310_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"  alt="" /></span><span id="Codehighlighter1_85_310_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_139_303_Open_Image" onclick="this.style.display='none'; Codehighlighter1_139_303_Open_Text.style.display='none'; Codehighlighter1_139_303_Closed_Image.style.display='inline'; Codehighlighter1_139_303_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_139_303_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_139_303_Closed_Text.style.display='none'; Codehighlighter1_139_303_Open_Image.style.display='inline'; Codehighlighter1_139_303_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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_139_303_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"  alt="" /></span><span id="Codehighlighter1_139_303_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder&nbsp;mingong&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Mingong();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Designer&nbsp;&nbsp;designer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;&nbsp;Designer();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;designer.order(mingong);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mingong.getRoom();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;</span></div>
5.房子类:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Room<br />
<img id="Codehighlighter1_18_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_72_Open_Text.style.display='none'; Codehighlighter1_18_72_Closed_Image.style.display='inline'; Codehighlighter1_18_72_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_18_72_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_72_Closed_Text.style.display='none'; Codehighlighter1_18_72_Open_Image.style.display='inline'; Codehighlighter1_18_72_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_18_72_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"  alt="" /></span><span id="Codehighlighter1_18_72_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Room()<br />
<img id="Codehighlighter1_36_70_Open_Image" onclick="this.style.display='none'; Codehighlighter1_36_70_Open_Text.style.display='none'; Codehighlighter1_36_70_Closed_Image.style.display='inline'; Codehighlighter1_36_70_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_36_70_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_36_70_Closed_Text.style.display='none'; Codehighlighter1_36_70_Open_Image.style.display='inline'; Codehighlighter1_36_70_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_36_70_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"  alt="" /></span><span id="Codehighlighter1_36_70_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">房子造好了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-23 17:18 <a href="http://www.blogjava.net/supercrsky/articles/202450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>factory模式的学习</title><link>http://www.blogjava.net/supercrsky/articles/202426.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Fri, 23 May 2008 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202426.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202426.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202426.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.Simple Factory模式:1、&nbsp;在这里，我们先定义水果（Fruit）接口：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package&nbsp;com.pattern.simplefac...&nbsp;&nbsp;<a href='http://www.blogjava.net/supercrsky/articles/202426.html'>阅读全文</a><img src ="http://www.blogjava.net/supercrsky/aggbug/202426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-23 16:03 <a href="http://www.blogjava.net/supercrsky/articles/202426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Singleton模式的学习</title><link>http://www.blogjava.net/supercrsky/articles/202410.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Fri, 23 May 2008 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202410.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202410.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202410.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;">
Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。
<p> 在很多操作中，比如建立目录 数据库连接都需要这样的单线程操作。</p>
<p>还
有, singleton能够被状态化;
这样，多个单态类在一起就可以作为一个状态仓库一样向外提供服务，比如，你要论坛中的帖子计数器，每次浏览一次需要计数，单态类能否保持住这个计数，并且
能synchronize的安全自动加1，如果你要把这个数字永久保存到数据库，你可以在不修改单态接口的情况下方便的做到。</p>
<p>另外方面，Singleton也能够被无状态化。提供工具性质的功能，<br />
<br />
Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存，因为它限制了实例的个数，有利于Java垃圾回收（garbage
collection）。<br />
<br />
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。<br />
</p>
<p><strong>如何使用?</strong><br />
一般Singleton模式通常有几种形式:</p>
第一种形式:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.pattern.singleton;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton1<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Singleton1&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;Singleton1();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造方法必须为private<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Singleton1()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这里提供了一个供外部访问本class的静态方法，可以直接访问</span><span style="color: #008000;"><br />
</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;">static</span><span style="color: #000000;">&nbsp;Singleton1&nbsp;getInstance()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;instance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<p>第二种形式:</p>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.pattern.singleton;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton2<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Singleton2&nbsp;instance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Singleton2()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;注意要加synchronized&nbsp;关键,否则多纯种模式下可能单例模式失败<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&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;Singleton2&nbsp;getInstance()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(instance&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;Singleton2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;instance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<p>使用Singleton.getInstance()可以访问单态类。</p>
<p>上面第二中形式是lazy initialization，也就是说第一次调用时初始Singleton，以后就不用再生成了。</p>
<p>注意到lazy initialization形式中的synchronized，这个synchronized很重要，如果没有synchronized，那么使用getInstance()是有可能得到多个Singleton实例。关于lazy
initialization的Singleton有很多涉及double-checked locking (DCL)的讨论，有兴趣者进一步研究。</p>
<p>一般认为第一种形式要更加安全些。<br />
</p>
<p><strong>使用Singleton注意事项</strong>：<br />
有时在某些情况下，使用Singleton并不能达到Singleton的目的，如有多个Singleton对象同时被不同的类装入器装载；在EJB这样的分布式系统中使用也要注意这种情况，因为EJB是跨服务器，跨JVM的。</p>
<p>我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下：<br />
<br />
在Pet
Store中ServiceLocator有两种，一个是EJB目录下；一个是WEB目录下，我们检查这两个ServiceLocator会发现内容差不
多，都是提供EJB的查询定位服务，可是为什么要分开呢？仔细研究对这两种ServiceLocator才发现区别：在WEB中的
ServiceLocator的采取Singleton模式，ServiceLocator属于资源定位，理所当然应该使用Singleton模式。但是
在EJB中，Singleton模式已经失去作用，所以ServiceLocator才分成两种，一种面向WEB服务的，一种是面向EJB服务的。</p>
<p>Singleton模式看起来简单，使用方法也很方便，但是真正用好，是非常不容易，需要对Java的类 线程 内存等概念有相当的了解。</p>
<p>总之：如果你的应用基于容器，那么Singleton模式少用或者不用，可以使用相关替代技术。</p>
</span>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-23 15:18 <a href="http://www.blogjava.net/supercrsky/articles/202410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter设计模式的学习</title><link>http://www.blogjava.net/supercrsky/articles/202406.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Fri, 23 May 2008 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/202406.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/202406.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/202406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/202406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/202406.html</trackback:ping><description><![CDATA[<div>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">GOF</span><span style="font-family: 宋体;">《设计模式》一书对Adapter模式是这样描述的：<br />
&nbsp;&nbsp;</span>&nbsp;<span style="font-family: 宋体;">将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。</span></p>
<p style="text-indent: 21pt;">图解 :</p>
<br />
<p style="text-indent: 21pt;"><br />
</p>
<p style="text-indent: 21pt;"><img src="http://www.blogjava.net/images/blogjava_net/supercrsky/adapter.png" alt="" border="0" /><br />
</p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/supercrsky/ObjectAdapter.png" alt="" border="0" /><br />
</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">这段话大致是说：我们需要一种方式，为一个功能正确但接口不合的对象创建一个新接口。例如，客户给我们如下需求：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体;">1）&nbsp;</span><span style="font-family: 宋体;">为都有&#8220;显示&#8221;(display)行为的点、线、正方形分别创建类。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体;">2）&nbsp;</span><span style="font-family: 宋体;">客户对象不必知道自己到底拥有点、线、还是正方形。它只需知道拥有这些形状中的一个。</span></p>
<p><span style="font-family: 宋体;">也就是说，我们要用一个更高层次的概念将这些具体形状都涵盖进去，这个高层概念可以称为：&#8220;可显示的形状&#8221;。因此，我们需要创建一个接口Shape:</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">interface</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> Shape{</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> display();</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New';">}</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 宋体;">现在客户忽然间有让我们给这个系统增加一个画圆的功能。这个看起来很简单，只需定义一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">Circle</span><span style="font-size: 10pt; color: black; font-family: 宋体;">类来实现</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">Shape</span><span style="font-size: 10pt; color: black; font-family: 宋体;">接口，但是我们要给它编写</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">display</span><span style="font-size: 10pt; color: black; font-family: 宋体;">方法，这可不是件简单的事，假如此时我们正好发现一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">XXCircle</span><span style="font-size: 10pt; color: black; font-family: 宋体;">类，它有一个方法刚好可以完成这个功能，那么有没有更好的方法来利用它呢，这时我们就要用到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体;">模式了。</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">XXCircle</span><span style="font-size: 10pt; color: black; font-family: 宋体;">代码如下：</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> XXCircle{</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> displayCircle(){</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New';">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New';">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New';">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体;">通过</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New';">XXCircle.displayCircle()</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体;">画圆</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New';">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">);</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New';">}</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体;">模式有两种类型：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">1)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: black; font-family: 宋体;">对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体;">模式，它依赖于一个对象（适配器）包含另一个对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">(</span><span style="font-size: 10pt; color: black; font-family: 宋体;">被适配的对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">)</span><span style="font-size: 10pt; color: black; font-family: 宋体;">。</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> CircleObject </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> Shape{</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> XXCircle </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New';">circle</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">;</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> CircleObject(XXCircle xxcircle){</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New';">circle</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">=xxcircle;</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> display() {</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New';">circle</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';">.displayCircle();&nbsp;</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New';">}</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> Client {</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">static </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> main(String[] args) {</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XXCircle circle=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> XXCircle();</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CircleObject <span style="background: silver none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">co</span>=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> CircleObject(circle);</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background: silver none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">co</span>.display();</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 18pt;"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">}</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体;">2)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">类Adapter模式，它是通过多重继承来实现的（java中没有多继承，是通过接口来实现的）。</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> CircleClass </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> XXCircle </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> Shape{</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> display() {</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">super</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';">.displayCircle();&nbsp;&nbsp; </span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New';">}</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> Client {</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">static </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> main(String[] args) {</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CircleClass cc=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';"> CircleClass();</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc.display();</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New';">}</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">小结：Adapter模式是一个很常用的模式，它将一个（或多个）类的接口转换成我们需要类所具备的一个接口。它的实现方式是：创建一个具备所需接口的类，然后包装原有类的方法，这样实际上就包含了被适配的对象。它主要适用于以下几种情况：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体;">1）&nbsp;</span><span style="font-family: 宋体;">你希望使用他人编写的子程序或方法，因为你需要它所执行的功能。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体;">2）&nbsp;</span><span style="font-family: 宋体;">你无法将这个子程序直接加入程序中。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体;">3）&nbsp;</span><span style="font-family: 宋体;">子程序的接口或调用方式与需要使用它的相关对象不完全相同。</span></p>
</div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/202406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-23 15:00 <a href="http://www.blogjava.net/supercrsky/articles/202406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>组合(Composite)模式--实践</title><link>http://www.blogjava.net/supercrsky/articles/201060.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sat, 17 May 2008 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/201060.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/201060.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/201060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/201060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/201060.html</trackback:ping><description><![CDATA[<p>组合(Composite)模式主要角色： <br />
1.Component角色 <br />
2.Leaf角色 <br />
3.Composite角色 </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.composite;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_34_59_Open_Image" onclick="this.style.display='none'; Codehighlighter1_34_59_Open_Text.style.display='none'; Codehighlighter1_34_59_Closed_Image.style.display='inline'; Codehighlighter1_34_59_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_34_59_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_34_59_Closed_Text.style.display='none'; Codehighlighter1_34_59_Open_Image.style.display='inline'; Codehighlighter1_34_59_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_34_59_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">/**&nbsp;*/</span><span id="Codehighlighter1_34_59_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;组件抽象角色&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_90_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_132_Open_Text.style.display='none'; Codehighlighter1_90_132_Closed_Image.style.display='inline'; Codehighlighter1_90_132_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_90_132_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_90_132_Closed_Text.style.display='none'; Codehighlighter1_90_132_Open_Image.style.display='inline'; Codehighlighter1_90_132_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Component&nbsp;</span><span id="Codehighlighter1_90_132_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"  alt="" /></span><span id="Codehighlighter1_90_132_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.composite;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_34_57_Open_Image" onclick="this.style.display='none'; Codehighlighter1_34_57_Open_Text.style.display='none'; Codehighlighter1_34_57_Closed_Image.style.display='inline'; Codehighlighter1_34_57_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_34_57_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_34_57_Closed_Text.style.display='none'; Codehighlighter1_34_57_Open_Image.style.display='inline'; Codehighlighter1_34_57_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_34_57_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">/**&nbsp;*/</span><span id="Codehighlighter1_34_57_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;叶子角色&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_99_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_200_Open_Text.style.display='none'; Codehighlighter1_99_200_Closed_Image.style.display='inline'; Codehighlighter1_99_200_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_200_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_200_Closed_Text.style.display='none'; Codehighlighter1_99_200_Open_Image.style.display='inline'; Codehighlighter1_99_200_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Leaf&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Component</span><span id="Codehighlighter1_99_200_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"  alt="" /></span><span id="Codehighlighter1_99_200_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_133_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_192_Open_Text.style.display='none'; Codehighlighter1_133_192_Closed_Image.style.display='inline'; Codehighlighter1_133_192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_133_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_133_192_Closed_Text.style.display='none'; Codehighlighter1_133_192_Open_Image.style.display='inline'; Codehighlighter1_133_192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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()</span><span id="Codehighlighter1_133_192_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"  alt="" /></span><span id="Codehighlighter1_133_192_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;run&nbsp;invoked<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.composite;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.ArrayList;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_94_551_Open_Image" onclick="this.style.display='none'; Codehighlighter1_94_551_Open_Text.style.display='none'; Codehighlighter1_94_551_Closed_Image.style.display='inline'; Codehighlighter1_94_551_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_94_551_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_94_551_Closed_Text.style.display='none'; Codehighlighter1_94_551_Open_Image.style.display='inline'; Codehighlighter1_94_551_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_94_551_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">/**&nbsp;*/</span><span id="Codehighlighter1_94_551_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;组合角色&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;实现组件角色接口，并且添加，删除的也是组件角色&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Composite本来可以再包含Leaf和Composite的。而&nbsp;Leaf和Composite&nbsp;又都属于&nbsp;Component，所以增加，删除&nbsp;的是Component&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;组合模式主要分为2种&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;1&nbsp;透明式&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;添加Component对象的操作定义在Component角色中，这样的话不仅Composite需要实现这些方法，Leaf也需要实现这些方法，&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;而这些方法对于Leaf来说没有任何意义，不过将系统实现统一起来了，因此对用户来说透明（用户无需区分Composite还是Leaf）&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;，因为这些角色中都具备这些方法。&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;2&nbsp;安全式&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;添加Component对象的操作定义在Composite角色中，这样的话Leaf就无需实现这些方法（因为Leaf本身根本不需要实现这些方法）&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_599_1127_Open_Image" onclick="this.style.display='none'; Codehighlighter1_599_1127_Open_Text.style.display='none'; Codehighlighter1_599_1127_Closed_Image.style.display='inline'; Codehighlighter1_599_1127_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_599_1127_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_599_1127_Closed_Text.style.display='none'; Codehighlighter1_599_1127_Open_Image.style.display='inline'; Codehighlighter1_599_1127_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Composite&nbsp;&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Component</span><span id="Codehighlighter1_599_1127_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"  alt="" /></span><span id="Codehighlighter1_599_1127_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Component</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Component</span><span style="color: #000000">&gt;</span><span style="color: #000000">();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">添加&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_739_780_Open_Image" onclick="this.style.display='none'; Codehighlighter1_739_780_Open_Text.style.display='none'; Codehighlighter1_739_780_Closed_Image.style.display='inline'; Codehighlighter1_739_780_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_739_780_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_739_780_Closed_Text.style.display='none'; Codehighlighter1_739_780_Open_Image.style.display='inline'; Codehighlighter1_739_780_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></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">void</span><span style="color: #000000">&nbsp;addComponent(Component&nbsp;component)</span><span id="Codehighlighter1_739_780_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"  alt="" /></span><span id="Codehighlighter1_739_780_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(component);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">删除&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_849_893_Open_Image" onclick="this.style.display='none'; Codehighlighter1_849_893_Open_Text.style.display='none'; Codehighlighter1_849_893_Closed_Image.style.display='inline'; Codehighlighter1_849_893_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_849_893_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_849_893_Closed_Text.style.display='none'; Codehighlighter1_849_893_Open_Image.style.display='inline'; Codehighlighter1_849_893_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></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">void</span><span style="color: #000000">&nbsp;removeComponent(Component&nbsp;component)</span><span id="Codehighlighter1_849_893_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"  alt="" /></span><span id="Codehighlighter1_849_893_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(component);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">get&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_954_987_Open_Image" onclick="this.style.display='none'; Codehighlighter1_954_987_Open_Text.style.display='none'; Codehighlighter1_954_987_Closed_Image.style.display='inline'; Codehighlighter1_954_987_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_954_987_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_954_987_Closed_Text.style.display='none'; Codehighlighter1_954_987_Open_Image.style.display='inline'; Codehighlighter1_954_987_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Component</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getAll()</span><span id="Codehighlighter1_954_987_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"  alt="" /></span><span id="Codehighlighter1_954_987_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1021_1119_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1021_1119_Open_Text.style.display='none'; Codehighlighter1_1021_1119_Closed_Image.style.display='inline'; Codehighlighter1_1021_1119_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1021_1119_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1021_1119_Closed_Text.style.display='none'; Codehighlighter1_1021_1119_Open_Image.style.display='inline'; Codehighlighter1_1021_1119_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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()</span><span id="Codehighlighter1_1021_1119_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"  alt="" /></span><span id="Codehighlighter1_1021_1119_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1065_1110_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1065_1110_Open_Text.style.display='none'; Codehighlighter1_1065_1110_Closed_Image.style.display='inline'; Codehighlighter1_1065_1110_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1065_1110_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1065_1110_Closed_Text.style.display='none'; Codehighlighter1_1065_1110_Open_Image.style.display='inline'; Codehighlighter1_1065_1110_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(Component&nbsp;component&nbsp;:&nbsp;list)</span><span id="Codehighlighter1_1065_1110_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"  alt="" /></span><span id="Codehighlighter1_1065_1110_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.run();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.pattern.composite;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_57_593_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_593_Open_Text.style.display='none'; Codehighlighter1_57_593_Closed_Image.style.display='inline'; Codehighlighter1_57_593_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_57_593_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_57_593_Closed_Text.style.display='none'; Codehighlighter1_57_593_Open_Image.style.display='inline'; Codehighlighter1_57_593_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client&nbsp;</span><span id="Codehighlighter1_57_593_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"  alt="" /></span><span id="Codehighlighter1_57_593_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_107_588_Open_Image" onclick="this.style.display='none'; Codehighlighter1_107_588_Open_Text.style.display='none'; Codehighlighter1_107_588_Closed_Image.style.display='inline'; Codehighlighter1_107_588_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_107_588_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_107_588_Closed_Text.style.display='none'; Codehighlighter1_107_588_Open_Image.style.display='inline'; Codehighlighter1_107_588_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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_107_588_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"  alt="" /></span><span id="Codehighlighter1_107_588_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf&nbsp;leaf1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Leaf();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf&nbsp;leaf2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Leaf();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf&nbsp;leaf3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Leaf();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;composite&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.addComponent(leaf1);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.addComponent(leaf2);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;composite1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.addComponent(composite);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.addComponent(leaf3);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.run();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span></div>
</span>
<img src ="http://www.blogjava.net/supercrsky/aggbug/201060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-17 11:10 <a href="http://www.blogjava.net/supercrsky/articles/201060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Composite(组合)</title><link>http://www.blogjava.net/supercrsky/articles/201058.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sat, 17 May 2008 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/201058.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/201058.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/201058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/201058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/201058.html</trackback:ping><description><![CDATA[Composite定义:<br />
将对象以树形结构组织起来,以达成&#8220;部分－整体&#8221; 的层次结构，使得客户端对单个对象和组合对象的使用具有一致性.<br />
<br />
Composite比较容易理解，想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时，Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。<br />
<br />
所以Composite模式使用到Iterator模式，和Chain of Responsibility模式类似。<br />
<br />
Composite好处:<br />
1.使客户端调用简单，客户端可以一致的使用组合结构或其中单个对象，用户就不必关系自己处理的是单个对象还是整个组合结构，这就简化了客户端代码。<br />
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。<br />
<br />
如何使用Composite?<br />
首先定义一个接口或抽象类，这是设计模式通用方式了，其他设计模式对接口内部定义限制不多，Composite却有个规定，那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们（或称部件Component）.<br />
<br />
<br />
Composite分为三个角色:<br />
<br />
<strong>1.Component</strong><br />
树形结构的节点抽象<br />
- 为所有的对象定义统一的接口（公共属性，行为等的定义）<br />
- 提供管理子节点对象的接口方法<br />
- [可选]提供管理父节点对象的接口方法<br />
<br />
<strong>2.Leaf</strong><br />
树形结构的叶节点。Component的实现子类<br />
<br />
<strong>3.Composite</strong><br />
树形结构的枝节点。Component的实现子类<br />
<br />
<br />
Composite分为:
<p>1 透明式</p>
<p>&nbsp;添加Component对象的操作定义在Component角色中，这样的话不仅Composite需要实现这些方法，Leaf也需要实现这些方法，<br />
&nbsp;而这些方法对于Leaf来说没有任何意义，不过将系统实现统一起来了，因此对用户来说透明（用户无需区分Composite还是Leaf）<br />
&nbsp;，因为这些角色中都具备这些方法。<br />
&nbsp;<br />
2 安全式</p>
<p>&nbsp;添加Component对象的操作定义在Composite角色中，这样的话Leaf就无需实现这些方法（因为Leaf本身根本不需要实现这些方法）</p>
<p>&nbsp;</p>
<p>安全式的实现:<br />
<br />
1.抽象角色:<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.composite;<br />
<img id="Codehighlighter1_23_56_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_56_Open_Text.style.display='none'; Codehighlighter1_23_56_Closed_Image.style.display='inline'; Codehighlighter1_23_56_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_23_56_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_23_56_Closed_Text.style.display='none'; Codehighlighter1_23_56_Open_Image.style.display='inline'; Codehighlighter1_23_56_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_23_56_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">/**&nbsp;*/</span><span id="Codehighlighter1_23_56_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;抽象角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_85_105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_105_Open_Text.style.display='none'; Codehighlighter1_85_105_Closed_Image.style.display='inline'; Codehighlighter1_85_105_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_85_105_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_85_105_Closed_Text.style.display='none'; Codehighlighter1_85_105_Open_Image.style.display='inline'; Codehighlighter1_85_105_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_85_105_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"  alt="" /></span><span id="Codehighlighter1_85_105_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doAction();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
2.叶子角色:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.composite;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_24_61_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_61_Open_Text.style.display='none'; Codehighlighter1_24_61_Closed_Image.style.display='inline'; Codehighlighter1_24_61_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_24_61_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_24_61_Closed_Text.style.display='none'; Codehighlighter1_24_61_Open_Image.style.display='inline'; Codehighlighter1_24_61_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_24_61_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">/**&nbsp;*/</span><span id="Codehighlighter1_24_61_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;叶子角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Leaf&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_102_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_187_Open_Text.style.display='none'; Codehighlighter1_102_187_Closed_Image.style.display='inline'; Codehighlighter1_102_187_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_102_187_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_102_187_Closed_Text.style.display='none'; Codehighlighter1_102_187_Open_Image.style.display='inline'; Codehighlighter1_102_187_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_102_187_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"  alt="" /></span><span id="Codehighlighter1_102_187_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;doAction()<br />
<img id="Codehighlighter1_141_184_Open_Image" onclick="this.style.display='none'; Codehighlighter1_141_184_Open_Text.style.display='none'; Codehighlighter1_141_184_Closed_Image.style.display='inline'; Codehighlighter1_141_184_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_141_184_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_141_184_Closed_Text.style.display='none'; Codehighlighter1_141_184_Open_Image.style.display='inline'; Codehighlighter1_141_184_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_141_184_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"  alt="" /></span><span id="Codehighlighter1_141_184_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Leaf&nbsp;do&nbsp;Action</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>3.Comosite角色<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.composite;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.ArrayList;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_76_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_76_120_Open_Text.style.display='none'; Codehighlighter1_76_120_Closed_Image.style.display='inline'; Codehighlighter1_76_120_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_76_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_76_120_Closed_Text.style.display='none'; Codehighlighter1_76_120_Open_Image.style.display='inline'; Codehighlighter1_76_120_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_76_120_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">/**&nbsp;*/</span><span id="Codehighlighter1_76_120_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Composite角色<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zdw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Composite&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_166_634_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_634_Open_Text.style.display='none'; Codehighlighter1_166_634_Closed_Image.style.display='inline'; Codehighlighter1_166_634_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_166_634_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_166_634_Closed_Text.style.display='none'; Codehighlighter1_166_634_Open_Image.style.display='inline'; Codehighlighter1_166_634_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_166_634_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"  alt="" /></span><span id="Codehighlighter1_166_634_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Component</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Component</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;addComponent(Component&nbsp;component)<br />
<img id="Codehighlighter1_277_345_Open_Image" onclick="this.style.display='none'; Codehighlighter1_277_345_Open_Text.style.display='none'; Codehighlighter1_277_345_Closed_Image.style.display='inline'; Codehighlighter1_277_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_277_345_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_277_345_Closed_Text.style.display='none'; Codehighlighter1_277_345_Open_Image.style.display='inline'; Codehighlighter1_277_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_277_345_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"  alt="" /></span><span id="Codehighlighter1_277_345_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">list.contains(component))<br />
<img id="Codehighlighter1_314_342_Open_Image" onclick="this.style.display='none'; Codehighlighter1_314_342_Open_Text.style.display='none'; Codehighlighter1_314_342_Closed_Image.style.display='inline'; Codehighlighter1_314_342_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_314_342_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_314_342_Closed_Text.style.display='none'; Codehighlighter1_314_342_Open_Image.style.display='inline'; Codehighlighter1_314_342_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_314_342_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"  alt="" /></span><span id="Codehighlighter1_314_342_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(component);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;removeComonent(Component&nbsp;component)<br />
<img id="Codehighlighter1_398_468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_398_468_Open_Text.style.display='none'; Codehighlighter1_398_468_Closed_Image.style.display='inline'; Codehighlighter1_398_468_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_398_468_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_398_468_Closed_Text.style.display='none'; Codehighlighter1_398_468_Open_Image.style.display='inline'; Codehighlighter1_398_468_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_398_468_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"  alt="" /></span><span id="Codehighlighter1_398_468_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(list.contains(component))<br />
<img id="Codehighlighter1_434_465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_434_465_Open_Text.style.display='none'; Codehighlighter1_434_465_Closed_Image.style.display='inline'; Codehighlighter1_434_465_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_434_465_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_434_465_Closed_Text.style.display='none'; Codehighlighter1_434_465_Open_Image.style.display='inline'; Codehighlighter1_434_465_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_434_465_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"  alt="" /></span><span id="Codehighlighter1_434_465_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(component);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Component</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getAllComponents()<br />
<img id="Codehighlighter1_515_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_515_533_Open_Text.style.display='none'; Codehighlighter1_515_533_Closed_Image.style.display='inline'; Codehighlighter1_515_533_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_515_533_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_515_533_Closed_Text.style.display='none'; Codehighlighter1_515_533_Open_Image.style.display='inline'; Codehighlighter1_515_533_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_515_533_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"  alt="" /></span><span id="Codehighlighter1_515_533_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;doAction()<br />
<img id="Codehighlighter1_572_631_Open_Image" onclick="this.style.display='none'; Codehighlighter1_572_631_Open_Text.style.display='none'; Codehighlighter1_572_631_Closed_Image.style.display='inline'; Codehighlighter1_572_631_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_572_631_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_572_631_Closed_Text.style.display='none'; Codehighlighter1_572_631_Open_Image.style.display='inline'; Codehighlighter1_572_631_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_572_631_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"  alt="" /></span><span id="Codehighlighter1_572_631_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Component&nbsp;com&nbsp;:&nbsp;list)<br />
<img id="Codehighlighter1_605_628_Open_Image" onclick="this.style.display='none'; Codehighlighter1_605_628_Open_Text.style.display='none'; Codehighlighter1_605_628_Closed_Image.style.display='inline'; Codehighlighter1_605_628_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_605_628_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_605_628_Closed_Text.style.display='none'; Codehighlighter1_605_628_Open_Image.style.display='inline'; Codehighlighter1_605_628_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_605_628_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"  alt="" /></span><span id="Codehighlighter1_605_628_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.doAction();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
现在写个测试类来测试:<br />
</p>
<div title="Print Page Break" style="font-size: 1px; page-break-before: always; vertical-align: middle; height: 1px; background-color: #c0c0c0">&nbsp; </div>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.composite;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client<br />
<img id="Codehighlighter1_44_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_288_Open_Text.style.display='none'; Codehighlighter1_44_288_Closed_Image.style.display='inline'; Codehighlighter1_44_288_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_44_288_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_44_288_Closed_Text.style.display='none'; Codehighlighter1_44_288_Open_Image.style.display='inline'; Codehighlighter1_44_288_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_44_288_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_44_288_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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)<br />
<img id="Codehighlighter1_87_286_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_286_Open_Text.style.display='none'; Codehighlighter1_87_286_Closed_Image.style.display='inline'; Codehighlighter1_87_286_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_87_286_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_87_286_Closed_Text.style.display='none'; Codehighlighter1_87_286_Open_Image.style.display='inline'; Codehighlighter1_87_286_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_87_286_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"  alt="" /></span><span id="Codehighlighter1_87_286_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;leaf1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Leaf();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;leaf2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Leaf();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;composite&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Composite();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.addComponent(leaf1);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.addComponent(leaf2);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.doAction();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
对于透明模式只需要把add()或remove等方法,写个抽象角色接口里面就行了.<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;remove();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/201058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-17 11:06 <a href="http://www.blogjava.net/supercrsky/articles/201058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Command</title><link>http://www.blogjava.net/supercrsky/articles/200500.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Wed, 14 May 2008 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/200500.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/200500.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/200500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/200500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/200500.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;">
<p>Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才
对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse.</p>
<p><strong>Command定义</strong><br />
n 将来自客户端的请求传入一个对象，无需了解这个请求激活的 动作或有关接受这个请求的处理细节。</p>
<p>这是一种两台机器之间通讯联系性质的模式，类似传统过程语
言的 CallBack功能。
</p>
<p><strong>优点：<br />
</strong>解耦了发送者和接受者之间联系。 发送者调用一个操作，接受者接受请求执行相应的动作，因为使用Command模式解耦，发送者无需知道接受者任何接口。</p>
<p>不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作.</p>
<p>将
这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句话说,本来用户(调用者)是直接调用这些命令的,如菜
单上打开文档(调用者),就直接指向打开文档的代码,使用Command模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,同时两者之间都隔
离,基本没有关系了.</p>
<p>显然这样做的好处是符合封装的特性,降低耦合度,Command是将对行为进行封装的典型模式,Factory是将创建进行封装的模式,<br />
从Command模式,我也发现设计模式一个"通病":好象喜欢将简单的问题复杂化, 喜欢在不同类中增加第三者,当然这样做有利于代码的健壮性
可维护性 还有复用性.</p>
<p><strong>如何使用?</strong><br />
具体的Command模式代码各式各样,因为如何封装命令,不同系统,有不同的做法.下面事例是将命令封装在一个Collection的List中,任何
对象一旦加入List中,实际上装入了一个封闭的黑盒中,对象的特性消失了,只有取出时,才有可能模糊的分辨出:</p>
典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是"将命令/请求封装为对象":<br />
<table width="80%" border="0" cellpadding="3" cellspacing="3">
    <tbody>
        <tr>
            <td bgcolor="#cccccc">public interface Command {<br />
            public abstract void execute ( );<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
具体不同命令/请求代码是实现接口Command,下面有三个具体命令<br />
<table width="80%" bgcolor="#cccccc" border="0" cellpadding="3" cellspacing="3">
    <tbody>
        <tr>
            <td>public class Engineer implements Command {<br />
            <br />
            public void execute( ) {<br />
            //do Engineer's command<br />
            }<br />
            }
            <p>public class Programmer implements Command {<br />
            <br />
            public void execute( ) {<br />
            //do programmer's command<br />
            }<br />
            }</p>
            <p>public class Politician implements Command {<br />
            <br />
            public void execute( ) {<br />
            //do Politician's command<br />
            }<br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>按照通常做法,我们就可以直接调用这三个Command,但是使用Command模式,我们要将他们封装起来,扔到黑盒子List里去:<br />
</p>
<table width="80%" border="0" cellpadding="3" cellspacing="3">
    <tbody>
        <tr>
            <td bgcolor="#cccccc">
            <p>public class producer{<br />
            public static List produceRequests() {<br />
            List queue = new ArrayList();<br />
            queue.add( new DomesticEngineer() );<br />
            queue.add( new Politician() );<br />
            queue.add( new Programmer() );<br />
            return queue; <br />
            }</p>
            <p>}</p>
            </td>
        </tr>
    </tbody>
</table>
<p> 这三个命令进入List中后,已经失去了其外表特征,以后再取出,也可能无法分辨出谁是Engineer 谁是Programmer了,看下面客户端如何调用Command模式:<br />
</p>
<table width="80%" border="0" cellpadding="3" cellspacing="3">
    <tbody>
        <tr>
            <td bgcolor="#cccccc">
            <p>public class TestCommand {<br />
            public static void main(String[] args) {<br />
            <br />
            List queue = Producer.produceRequests();<br />
            for (Iterator it = queue.iterator(); it.hasNext(); )<br />
            <br />
            //客户端直接调用execute方法，无需知道被调用者的其它更多类的方法名。<br />
            ((Command)it.next()).execute();<br />
            </p>
            <p> 　　}<br />
            } </p>
            </td>
        </tr>
    </tbody>
</table>
<p> 由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了.<br />
<br />
理解了上面的代码的核心原理,在使用中,就应该各人有自己方法了,特别是在如何分离调用者和具体命令上,有很多实现方法,上面的代码是使用"从List过一遍"的做法.这种做法只是为了演示.<br />
</p>
<p>使用Command模式的一个好理由还因为它能实现Undo功能.每个具体命令都可以记住它刚刚执行的动作,并且在需要时恢复.</p>
<p>Command模式在界面设计中应用广泛.Java的Swing中菜单命令都是使用Command模式,由于Java在界面设计的性能上还有欠缺,因此界面设计具体代码我们就不讨论,网络上有很多这样的示例.</p>
</span>
<img src ="http://www.blogjava.net/supercrsky/aggbug/200500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-14 21:59 <a href="http://www.blogjava.net/supercrsky/articles/200500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出java命令模式   </title><link>http://www.blogjava.net/supercrsky/articles/200497.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Wed, 14 May 2008 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/200497.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/200497.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/200497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/200497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/200497.html</trackback:ping><description><![CDATA[<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">一、引言<br />
<br />
&nbsp;<br />
<br />
忙里偷闲，终于动笔了。命令模式是从界面设计中提取出来的一种分离耦合，提高重用的方法。被认为是最优雅而且简单的模式，它的应用范围非常广泛。让我们一起来认识下它吧。<br />
<br />
&nbsp;<br />
<br />
先从起源说起。在设计界面时，大家可以注意到这样的一种情况，同样的菜单控件，在不同的应用环境中的功能是完全不同的；而菜单选项的某个功能可能和鼠标右键的某个功能完全一致。按照最差、最原始的设计，这些不同功能的菜单、或者右键弹出菜单是要分开来实现的，你可以想象一下，word文档上面的一排菜单要实现出多少个&#8220;形似神非&#8221;的菜单类来？这完全是行不通的。这时，就要运用分离变化与不变的因素，将菜单触发的功能分离出来，而制作菜单的时候只是提供一个统一的触发接口。这样修改设计后，功能点可以被不同的菜单或者右键重用；而且菜单控件也可以去除变化因素，很大的提高了重用；而且分离了显示逻辑和业务逻辑的耦合。这便是命令模式的雏形。<br />
<br />
&nbsp;<br />
<br />
下面我们将仔细的讨论下命令模式。<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
二、定义与结构<br />
<br />
&nbsp;<br />
<br />
《设计模式》中命令模式的定义为：将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤消的操作。<br />
<br />
&nbsp;<br />
<br />
看起来，命令模式好像神通广大。其实命令模式的以上功能还要看你是怎么写的——程序总是程序员写出来的，你写啥它才能干啥：）<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在我看来，其实命令模式像很多设计模式一样——通过在你的请求和处理之间加上了一个中间人的角色，来达到分离耦合的目的。通过对中间人角色的特殊设计来形成不同的模式。当然命令模式就是一种特殊设计的结果。<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看下命令模式是有哪些角色来组成的吧。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;命令角色（Command）：声明执行操作的接口。有java接口或者抽象类来实现。<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体命令角色（Concrete&nbsp;Command）：将一个接收者对象绑定于一个动作；调用接收者相应的操作，以实现命令角色声明的执行操作的接口。<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户角色（Client）：创建一个具体命令对象（并可以设定它的接收者）。<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求者角色（Invoker）：调用命令对象执行这个请求。<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接收者角色（Receiver）：知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
以下是命令模式的类图，从中可以大致的了解到各个角色之间是怎么来协调工作的。<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
三、举例<br />
<br />
&nbsp;<br />
<br />
本来想接着我的JUnit分析来讲解命令模式。但是由于在JUnit中，参杂了其它的模式在里面，使得命令模式的特点不太明显。所以这里将以命令模式在Web开发中最常见的应用——Struts中Action的使用作为例子。<br />
<br />
&nbsp;<br />
<br />
在Struts中Action控制类是整个框架的核心，它连接着页面请求和后台业务逻辑处理。按照框架设计，每一个继承自Action的子类，都实现execute方法——调用后台真正处理业务的对象来完成任务。<br />
<br />
&nbsp;<br />
<br />
注：继承自DispatchAction的子类，则可以一个类里面处理多个类似的操作。这个在这不做讨论。<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面我们将Struts中的各个类与命令模式中的角色对号入座。<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先来看下命令角色——Action控制类<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Action&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*可以看出，Action中提供了两个版本的执行接口，而且实现了默认的空实现。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;ActionForward&nbsp;execute(&nbsp;ActionMapping&nbsp;mapping,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletRequest&nbsp;request,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletResponse&nbsp;response)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;execute(mapping,&nbsp;form,&nbsp;(HttpServletRequest)&nbsp;request,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(HttpServletResponse)&nbsp;response);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(ClassCastException&nbsp;e)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;ActionForward&nbsp;execute(&nbsp;ActionMapping&nbsp;mapping,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
&nbsp;<br />
<br />
下面的就是请求者角色，它仅仅负责调用命令角色执行操作。<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;RequestProcessor&nbsp;{<br />
<br />
&#8230;&#8230;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;ActionForward&nbsp;processActionPerform(HttpServletRequest&nbsp;request,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;action,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;IOException,&nbsp;ServletException&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;(action.execute(mapping,&nbsp;form,&nbsp;request,&nbsp;response));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;(processException(request,&nbsp;response,e,&nbsp;form,&nbsp;mapping));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
}<br />
<br />
&nbsp;<br />
<br />
Struts框架为我们提供了以上两个角色，要使用struts框架完成自己的业务逻辑，剩下的三个角色就要由我们自己来实现了。步骤如下：<br />
<br />
</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;很明显我们要先实现一个Action的子类，并重写execute方法。在此方法中调用业务模块的相应对象来完成任务。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现处理业务的业务类。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;配置struts</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">config.xml配置文件，将自己的Action和Form以及相应页面结合起来。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编写jsp，在页面中显式的制定对应的处理Action。<br />
<br />
一个完整的命令模式就介绍完了。当你在页面上提交请求后，Struts框架会根据配置文件中的定义，将你的Action对象作为参数传递给RequestProcessor类中的processActionPerform()方法，由此方法调用Action对象中的执行方法，进而调用业务层中的接收角色。这样就完成了请求的处理。<br />
<br />
&nbsp;<br />
<br />
四、Undo、事务及延伸<br />
<br />
&nbsp;<br />
<br />
在定义中提到，命令模式支持可撤销的操作。而在上面的举例中并没有体现出来。其实命令模式之所以能够支持这种操作，完全得益于在请求者与接收者之间添加了中间角色。为了实现undo功能，首先需要一个历史列表来保存已经执行过的具体命令角色对象；修改具体命令角色中的执行方法，使它记录更多的执行细节，并将自己放入历史列表中；并在具体命令角色中添加undo方法，此方法根据记录的执行细节来复原状态（很明显，首先程序员要清楚怎么来实现，因为它和execute的效果是一样的）。<br />
<br />
&nbsp;<br />
<br />
同样，redo功能也能够照此实现。<br />
<br />
&nbsp;<br />
<br />
命令模式还有一个常见的用法就是执行事务操作。这就是为什么命令模式还叫做事务模式的原因吧。它可以在请求被传递到接收者角色之前，检验请求的正确性，甚至可以检查和数据库中数据的一致性，而且可以结合组合模式的结构，来一次执行多个命令。<br />
<br />
&nbsp;<br />
<br />
使用命令模式不仅仅可以解除请求者和接收者之间的耦合，而且可以用来做批处理操作，这完全可以发挥你自己的想象——请求者发出的请求到达命令角色这里以后，先保存在一个列表中而不执行；等到一定的业务需要时，命令模式再将列表中全部的操作逐一执行。<br />
<br />
&nbsp;<br />
<br />
哦，命令模式实在太灵活了。真是一个很有用的东西啊！<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
五、优点及适用情况<br />
<br />
&nbsp;<br />
<br />
由上面的讲解可以看出命令模式有以下优点：<br />
<br />
</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;命令模式将调用操作的请求对象与知道如何实现该操作的接收对象解耦。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体命令角色可以被不同的请求者角色重用。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你可将多个命令装配成一个复合命令。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;增加新的具体命令角色很容易，因为这无需改变已有的类。<br />
<br />
GOF总结了命令模式的以下适用环境。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要抽象出待执行的动作，然后以参数的形式提供出来——类似于过程设计中的回调机制。而命令模式正是回调机制的一个面向对象的替代品。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始请求无关的生存期。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要支持取消操作。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;支持修改日志功能。这样当系统崩溃时，这些修改可以被重做一遍。<br />
<br />
</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要支持事务操作。<br />
<br />
&nbsp;<br />
<br />
六、总结<br />
<br />
&nbsp;<br />
<br />
命令模式是一个很有用的模式，希望这篇文章能给你实质性的帮助。谢谢大家指正。&nbsp;v<br />
<br />
&nbsp;</span></div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/200497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-05-14 21:55 <a href="http://www.blogjava.net/supercrsky/articles/200497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>