﻿<?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-java-随笔分类-设计/性能</title><link>http://www.blogjava.net/zhaozhenlin1224/category/43798.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 26 Jun 2011 11:03:14 GMT</lastBuildDate><pubDate>Sun, 26 Jun 2011 11:03:14 GMT</pubDate><ttl>60</ttl><item><title>常见的海量数据处理方法</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2011/06/26/353010.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sat, 25 Jun 2011 16:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2011/06/26/353010.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/353010.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2011/06/26/353010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/353010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/353010.html</trackback:ping><description><![CDATA[<div>1. 给定a、b两个文件，各存放50亿个url，每个url各占64字节，内存限制是4G，让你找出a、b文件共同的url？ <br />方案1：可以估计每个文件安的大小为50G&#215;64=320G，远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 <br />s 遍历文件a，对每个url求取 ，然后根据所取得的值将url分别存储到1000个小文件（记为 ）中。这样每个小文件的大约为300M。 <br />s 遍历文件b，采取和a相同的方式将url分别存储到1000各小文件（记为 ）。这样处理后，所有可能相同的url都在对应的小文件（ ）中，不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 <br />s 求每对小文件中相同的url时，可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url，看其是否在刚才构建的hash_set中，如果是，那么就是共同的url，存到文件里面就可以了。 <br />方案2：如果允许有一定的错误率，可以使用Bloom  filter，4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom  filter映射为这340亿bit，然后挨个读取另外一个文件的url，检查是否与Bloom  filter，如果是，那么该url应该是共同的url（注意会有一定的错误率）。 <br /> <br />2. 有10个文件，每个文件1G，每个文件的每一行存放的都是用户的query，每个文件的query都可能重复。要求你按照query的频度排序。 <br />方案1： <br />s 顺序读取10个文件，按照hash(query)%10的结果将query写入到另外10个文件（记为 ）中。这样新生成的文件每个的大小大约也1G（假设hash函数是随机的）。 <br />s 找一台内存在2G左右的机器，依次对 用hash_map(query,  query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的 query_cout输出到文件中。这样得到了10个排好序的文件（记为 ）。 <br />s 对 这10个文件进行归并排序（内排序与外排序相结合）。 <br />方案2： <br />一般query的总量是有限的，只是重复的次数比较多而已，可能对于所有的query，一次性就可以加入到内存了。这样，我们就可以采用trie树/hash_map等直接来统计每个query出现的次数，然后按出现次数做快速/堆/归并排序就可以了。 <br />方案3： <br />与方案1类似，但在做完hash，分成多个文件后，可以交给多个文件来处理，采用分布式的架构来处理（比如MapReduce），最后再进行合并。 <br /> <br />3. 有一个1G大小的一个文件，里面每一行是一个词，词的大小不超过16字节，内存限制大小是1M。返回频数最高的100个词。 <br />方案1：顺序读文件中，对于每个词x，取 ，然后按照该值存到5000个小文件（记为 ）  中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小，还可以按照类似的方法继续往下分，知道分解得到的小文件的大小都不超过1M。对   每个小文件，统计每个文件中出现的词以及相应的频率（可以采用trie树/hash_map等），并取出出现频率最大的100个词（可以用含100个结点  的最小堆），并把100词及相应的频率存入文件，这样又得到了5000个文件。下一步就是把这5000个文件进行归并（类似与归并排序）的过程了。 <br /> <br />4. 海量日志数据，提取出某日访问百度次数最多的那个IP。 <br />方案1：首先是这一天，并且是访问百度的日志中的IP取出来，逐个写入到一个大文件中。注意到IP是32位的，最多有 个  IP。同样可以采用映射的方法，比如模1000，把整个大文件映射为1000个小文件，再找出每个小文中出现频率最大的IP（可以采用hash_map进  行频率统计，然后再找出频率最大的几个）及相应的频率。然后再在这1000个最大的IP中，找出那个频率最大的IP，即为所求。 <br /> <br />5. 在2.5亿个整数中找出不重复的整数，内存不足以容纳这2.5亿个整数。 <br />方案1：采用2-Bitmap（每个数分配2bit，00表示不存在，01表示出现一次，10表示多次，11无意义）进行，共需内存  内存，还可以接受。然后扫描这2.5亿个整数，查看Bitmap中相对应位，如果是00变01，01变10，10保持不变。所描完事后，查看 bitmap，把对应位是01的整数输出即可。 <br />方案2：也可采用上题类似的方法，进行划分小文件的方法。然后在小文件中找出不重复的整数，并排序。然后再进行归并，注意去除重复的元素。 <br /> <br />6. 海量数据分布在100台电脑中，想个办法高校统计出这批数据的TOP10。 <br />方案1： <br />s  在每台电脑上求出TOP10，可以采用包含10个元素的堆完成（TOP10小，用最大堆，TOP10大，用最小堆）。比如求TOP10大，我们首先取前  10个元素调整成最小堆，如果发现，然后扫描后面的数据，并与堆顶元素比较，如果比堆顶元素大，那么用该元素替换堆顶，然后再调整为最小堆。最后堆中的元  素就是TOP10大。 <br />s 求出每台电脑上的TOP10后，然后把这100台电脑上的TOP10组合起来，共1000个数据，再利用上面类似的方法求出TOP10就可以了。 <br /> <br />7. 怎么在海量数据中找出重复次数最多的一个？ <br />方案1：先做hash，然后求模映射为小文件，求出每个小文件中重复次数最多的一个，并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求（具体参考前面的题）。 <br /> <br />8. 上千万或上亿数据（有重复），统计其中出现次数最多的钱N个数据。 <br />方案1：上千万或上亿的数据，现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了，可以用第6题提到的堆机制完成。 <br /> <br />9. 1000万字符串，其中有些是重复的，需要把重复的全部去掉，保留没有重复的字符串。请怎么设计和实现？ <br />方案1：这题用trie树比较合适，hash_map也应该能行。 <br /> <br />10. 一个文本文件，大约有一万行，每行一个词，要求统计出其中最频繁出现的前10个词，请给出思想，给出时间复杂度分析。 <br />方案1：这题是考虑时间效率。用trie树统计每个词出现的次数，时间复杂度是O(n*le)（le表示单词的平准长度）。然后是找出出现最频繁 的  前10个词，可以用堆来实现，前面的题中已经讲到了，时间复杂度是O(n*lg10)。所以总的时间复杂度，是O(n*le)与O(n*lg10)中较大  的哪一个。 <br /> <br />11. 一个文本文件，找出前10个经常出现的词，但这次文件比较长，说是上亿行或十亿行，总之无法一次读入内存，问最优解。 <br />方案1：首先根据用hash并求模，将文件分解为多个小文件，对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理，找出最终的10个最常出现的词。 <br /> <br />12. 100w个数中找出最大的100个数。 <br />方案1：在前面的题中，我们已经提到了，用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。 <br />方案2：采用快速排序的思想，每次分割之后只考虑比轴大的一部分，知道比轴大的一部分在比100多的时候，采用传统排序算法排序，取前100个。复杂度为O(100w*100)。 <br />方案3：采用局部淘汰法。选取前100个元素，并排序，记为序列L。然后一次扫描剩余的元素x，与排好序的100个元素中最小的元素比，如果比这 个  最小的要大，那么把这个最小的元素删除，并把x利用插入排序的思想，插入到序列L中。依次循环，知道扫描了所有的元素。复杂度为O(100w*100)。 <br /> <br />13. 寻找热门查询： <br />搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来，每个查询串的长度为1-255字节。假设目前有一千万个记录，这些查询串的重 复  读比较高，虽然总数是1千万，但是如果去除重复和，不超过3百万个。一个查询串的重复度越高，说明查询它的用户越多，也就越热门。请你统计最热门的10个  查询串，要求使用的内存不能超过1G。 <br />(1) 请描述你解决这个问题的思路； <br />(2) 请给出主要的处理流程，算法，以及算法的复杂度。 <br />方案1：采用trie树，关键字域存该查询串出现的次数，没有出现为0。最后用10个元素的最小推来对出现频率进行排序。 <br /> <br />14. 一共有N个机器，每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到 个数中的中数？ <br />方案1：先大体估计一下这些数的范围，比如这里假设这些数都是32位无符号整数（共有 个）。我们把0到 的整数划分为N个范围段，每个段包含  个整数。比如，第一个段位0到 ，第二段为 到 ，&#8230;，第N个段为 到 。  然后，扫描每个机器上的N个数，把属于第一个区段的数放到第一个机器上，属于第二个区段的数放到第二个机器上，&#8230;，属于第N个区段的数放到第N个机器上。  注意这个过程每个机器上存储的数应该是O(N)的。下面我们依次统计每个机器上数的个数，一次累加，直到找到第k个机器，在该机器上累加的数大于或等于  ，而在第k-1个机器上的累加数小于 ，并把这个数记为x。那么我们要找的中位数在第k个机器中，排在第 位。然后我们对第k个机器的数排序，并找出第  个数，即为所求的中位数。复杂度是 的。 <br />方案2：先对每台机器上的数进行排序。排好序后，我们采用归并排序的思想，将这N个机器上的数归并起来得到最终的排序。找到第n个便是所求。复杂度是n(i)的。 <br /> <br />15. 最大间隙问题 <br />给定n个实数 ，求着n个实数在实轴上向量2个数之间的最大差值，要求线性的时间算法。 <br />方案1：最先想到的方法就是先对这n个数据进行排序，然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法： <br />s 找到n个数据中最大和最小数据max和min。 <br />s 用n-2个点等分区间[min, max]，即将[min, max]等分为n-1个区间（前闭后开区间），将这些区间看作桶，编号为  ，且桶 的上界和桶i+1的下届相同，即每个桶的大小相同。每个桶的大小为： 。实际上，这些桶的边界构成了一个等差数列（首项为min，公差为  ），且认为将min放入第一个桶，将max放入第n-1个桶。 <br />s 将n个数放入n-1个桶中：将每个元素 分配到某个桶（编号为index），其中 ，并求出分到每个桶的最大最小数据。 <br />s  最大间隙：除最大最小数据max和min以外的n-2个数据放入n-1个桶中，由抽屉原理可知至少有一个桶是空的，又因为每个桶的大小相同，所以最大间隙   不会在同一桶中出现，一定是某个桶的上界和气候某个桶的下界之间隙，且该量筒之间的桶（即便好在该连个便好之间的桶）一定是空桶。也就是说，最大间隙在桶  i的上界和桶j的下界之间产生 。一遍扫描即可完成。 <br /> <br />16. 将多个集合合并成没有交集的集合：给定一个字符串的集合，格式如： 。要求将其中交集不为空的集合合并，要求合并完成的集合之间无交集，例如上例应输出 。 <br />(1) 请描述你解决这个问题的思路； <br />(2) 给出主要的处理流程，算法，以及算法的复杂度； <br />(3) 请描述可能的改进。 <br />方案1：采用并查集。首先所有的字符串都在单独的并查集中。然后依扫描每个集合，顺序合并将两个相邻元素合并。例如，对于 ，  首先查看aaa和bbb是否在同一个并查集中，如果不在，那么把它们所在的并查集合并，然后再看bbb和ccc是否在同一个并查集中，如果不在，那么也把   它们所在的并查集合并。接下来再扫描其他的集合，当所有的集合都扫描完了，并查集代表的集合便是所求。复杂度应该是O(NlgN)的。改进的话，首先可以  记录每个节点的根结点，改进查询。合并的时候，可以把大的和小的进行合，这样也减少复杂度。 <br /> <br />17. 最大子序列与最大子矩阵问题 <br />数组的最大子序列问题：给定一个数组，其中元素有正，也有负，找出其中一个连续子序列，使和最大。 <br />方案1：这个问题可以动态规划的思想解决。设 表示以第i个元素 结尾的最大子序列，那么显然 。基于这一点可以很快用代码实现。 <br />最大子矩阵问题：给定一个矩阵（二维数组），其中数据有大有小，请找一个子矩阵，使得子矩阵的和最大，并输出这个和。 <br />方案1：可以采用与最大子序列类似的思想来解决。如果我们确定了选择第i列和第j列之间的元素，那么在这个范围内，其实就是一个最大子序列问题。如何确定第i列和第j列可以词用暴搜的方法进行。                             <div id="topic_copyright">声明：ITeye文章版权属于作者，受法律保护。没有作者书面许可不得转载。 </div></div><img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/353010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2011-06-26 00:37 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2011/06/26/353010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Command模式</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313631.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 22 Feb 2010 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313631.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/313631.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/313631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/313631.html</trackback:ping><description><![CDATA[一、&nbsp;Command模式定义:<br />
将一个请求封装为一个对象，从而使你不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤销的操作.<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_14_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_14_187_Open_Text.style.display='none'; Codehighlighter1_14_187_Closed_Image.style.display='inline'; Codehighlighter1_14_187_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_14_187_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_14_187_Closed_Text.style.display='none'; Codehighlighter1_14_187_Open_Image.style.display='inline'; Codehighlighter1_14_187_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Document</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_14_187_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_14_187_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_38_73_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_73_Open_Text.style.display='none'; Codehighlighter1_38_73_Closed_Image.style.display='inline'; Codehighlighter1_38_73_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_38_73_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_38_73_Closed_Text.style.display='none'; Codehighlighter1_38_73_Open_Image.style.display='inline'; Codehighlighter1_38_73_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;display()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_38_73_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_38_73_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_94_129_Open_Image" onclick="this.style.display='none'; Codehighlighter1_94_129_Open_Text.style.display='none'; Codehighlighter1_94_129_Closed_Image.style.display='inline'; Codehighlighter1_94_129_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_94_129_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_94_129_Closed_Text.style.display='none'; Codehighlighter1_94_129_Open_Image.style.display='inline'; Codehighlighter1_94_129_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;undo()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_94_129_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_94_129_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_150_185_Open_Image" onclick="this.style.display='none'; Codehighlighter1_150_185_Open_Text.style.display='none'; Codehighlighter1_150_185_Closed_Image.style.display='inline'; Codehighlighter1_150_185_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_150_185_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_150_185_Closed_Text.style.display='none'; Codehighlighter1_150_185_Open_Image.style.display='inline'; Codehighlighter1_150_185_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;redo()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_150_185_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_150_185_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_214_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_214_240_Open_Text.style.display='none'; Codehighlighter1_214_240_Closed_Image.style.display='inline'; Codehighlighter1_214_240_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_214_240_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_214_240_Closed_Text.style.display='none'; Codehighlighter1_214_240_Open_Image.style.display='inline'; Codehighlighter1_214_240_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;DocumentCommand</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_214_240_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_214_240_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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;execute();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_289_431_Open_Image" onclick="this.style.display='none'; Codehighlighter1_289_431_Open_Text.style.display='none'; Codehighlighter1_289_431_Closed_Image.style.display='inline'; Codehighlighter1_289_431_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_289_431_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_289_431_Closed_Text.style.display='none'; Codehighlighter1_289_431_Open_Image.style.display='inline'; Codehighlighter1_289_431_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DisplayCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;DocumentCommand</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_289_431_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_289_431_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Document&nbsp;document;<br />
<img id="Codehighlighter1_355_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_374_Open_Text.style.display='none'; Codehighlighter1_355_374_Closed_Image.style.display='inline'; Codehighlighter1_355_374_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_355_374_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_355_374_Closed_Text.style.display='none'; Codehighlighter1_355_374_Open_Image.style.display='inline'; Codehighlighter1_355_374_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DisplayCommand(Document&nbsp;doc)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_355_374_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_355_374_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;document</span><span style="color: #000000">=</span><span style="color: #000000">doc;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_399_427_Open_Image" onclick="this.style.display='none'; Codehighlighter1_399_427_Open_Text.style.display='none'; Codehighlighter1_399_427_Closed_Image.style.display='inline'; Codehighlighter1_399_427_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_399_427_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_399_427_Closed_Text.style.display='none'; Codehighlighter1_399_427_Open_Image.style.display='inline'; Codehighlighter1_399_427_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;execute()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_399_427_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_399_427_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;document.display();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_477_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_477_625_Open_Text.style.display='none'; Codehighlighter1_477_625_Closed_Image.style.display='inline'; Codehighlighter1_477_625_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_477_625_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_477_625_Closed_Text.style.display='none'; Codehighlighter1_477_625_Open_Image.style.display='inline'; Codehighlighter1_477_625_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UndoCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;DocumentCommand</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_477_625_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_477_625_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Document&nbsp;document;<br />
<img id="Codehighlighter1_546_571_Open_Image" onclick="this.style.display='none'; Codehighlighter1_546_571_Open_Text.style.display='none'; Codehighlighter1_546_571_Closed_Image.style.display='inline'; Codehighlighter1_546_571_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_546_571_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_546_571_Closed_Text.style.display='none'; Codehighlighter1_546_571_Open_Image.style.display='inline'; Codehighlighter1_546_571_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;UndoCommand(Document&nbsp;doc)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_546_571_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_546_571_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document</span><span style="color: #000000">=</span><span style="color: #000000">doc;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_596_621_Open_Image" onclick="this.style.display='none'; Codehighlighter1_596_621_Open_Text.style.display='none'; Codehighlighter1_596_621_Closed_Image.style.display='inline'; Codehighlighter1_596_621_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_596_621_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_596_621_Closed_Text.style.display='none'; Codehighlighter1_596_621_Open_Image.style.display='inline'; Codehighlighter1_596_621_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;execute()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_596_621_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_596_621_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;document.undo();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_671_801_Open_Image" onclick="this.style.display='none'; Codehighlighter1_671_801_Open_Text.style.display='none'; Codehighlighter1_671_801_Closed_Image.style.display='inline'; Codehighlighter1_671_801_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_671_801_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_671_801_Closed_Text.style.display='none'; Codehighlighter1_671_801_Open_Image.style.display='inline'; Codehighlighter1_671_801_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RedoCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;DocumentCommand</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_671_801_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_671_801_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Document&nbsp;document;<br />
<img id="Codehighlighter1_734_753_Open_Image" onclick="this.style.display='none'; Codehighlighter1_734_753_Open_Text.style.display='none'; Codehighlighter1_734_753_Closed_Image.style.display='inline'; Codehighlighter1_734_753_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_734_753_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_734_753_Closed_Text.style.display='none'; Codehighlighter1_734_753_Open_Image.style.display='inline'; Codehighlighter1_734_753_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;RedoCommand(Document&nbsp;doc)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_734_753_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_734_753_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;document</span><span style="color: #000000">=</span><span style="color: #000000">doc;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_777_799_Open_Image" onclick="this.style.display='none'; Codehighlighter1_777_799_Open_Text.style.display='none'; Codehighlighter1_777_799_Closed_Image.style.display='inline'; Codehighlighter1_777_799_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_777_799_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_777_799_Closed_Text.style.display='none'; Codehighlighter1_777_799_Open_Image.style.display='inline'; Codehighlighter1_777_799_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;execute()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_777_799_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_777_799_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;document.redo();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_824_1185_Open_Image" onclick="this.style.display='none'; Codehighlighter1_824_1185_Open_Text.style.display='none'; Codehighlighter1_824_1185_Closed_Image.style.display='inline'; Codehighlighter1_824_1185_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_824_1185_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_824_1185_Closed_Text.style.display='none'; Codehighlighter1_824_1185_Open_Image.style.display='inline'; Codehighlighter1_824_1185_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DocumentInvoker</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_824_1185_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_824_1185_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;DisplayCommand&nbsp;_dcmd;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;UndoCommand&nbsp;_ucmd;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;RedoCommand&nbsp;_rcmd;<br />
<img id="Codehighlighter1_991_1051_Open_Image" onclick="this.style.display='none'; Codehighlighter1_991_1051_Open_Text.style.display='none'; Codehighlighter1_991_1051_Closed_Image.style.display='inline'; Codehighlighter1_991_1051_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_991_1051_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_991_1051_Closed_Text.style.display='none'; Codehighlighter1_991_1051_Open_Image.style.display='inline'; Codehighlighter1_991_1051_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DocumentInvoker(DisplayCommand&nbsp;dcmd,UndoCommand&nbsp;ucmd,RedoCommand&nbsp;rcmd)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_991_1051_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_991_1051_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._dcmd</span><span style="color: #000000">=</span><span style="color: #000000">dcmd;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._ucmd</span><span style="color: #000000">=</span><span style="color: #000000">ucmd;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._rcmd</span><span style="color: #000000">=</span><span style="color: #000000">rcmd;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1075_1097_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1075_1097_Open_Text.style.display='none'; Codehighlighter1_1075_1097_Closed_Image.style.display='inline'; Codehighlighter1_1075_1097_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1075_1097_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1075_1097_Closed_Text.style.display='none'; Codehighlighter1_1075_1097_Open_Image.style.display='inline'; Codehighlighter1_1075_1097_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;display()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1075_1097_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1075_1097_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;_dcmd.execute();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1118_1140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1118_1140_Open_Text.style.display='none'; Codehighlighter1_1118_1140_Closed_Image.style.display='inline'; Codehighlighter1_1118_1140_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1118_1140_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1118_1140_Closed_Text.style.display='none'; Codehighlighter1_1118_1140_Open_Image.style.display='inline'; Codehighlighter1_1118_1140_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;undo()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1118_1140_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1118_1140_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;_ucmd.execute();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1161_1183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1161_1183_Open_Text.style.display='none'; Codehighlighter1_1161_1183_Closed_Image.style.display='inline'; Codehighlighter1_1161_1183_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1161_1183_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1161_1183_Closed_Text.style.display='none'; Codehighlighter1_1161_1183_Open_Image.style.display='inline'; Codehighlighter1_1161_1183_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;redo()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1161_1183_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1161_1183_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;_rcmd.execute();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1212_1548_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1212_1548_Open_Text.style.display='none'; Codehighlighter1_1212_1548_Closed_Image.style.display='inline'; Codehighlighter1_1212_1548_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1212_1548_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1212_1548_Closed_Text.style.display='none'; Codehighlighter1_1212_1548_Open_Image.style.display='inline'; Codehighlighter1_1212_1548_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  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;CommandTest&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1212_1548_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1212_1548_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_1255_1545_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1255_1545_Open_Text.style.display='none'; Codehighlighter1_1255_1545_Closed_Image.style.display='inline'; Codehighlighter1_1255_1545_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1255_1545_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1255_1545_Closed_Text.style.display='none'; Codehighlighter1_1255_1545_Open_Image.style.display='inline'; Codehighlighter1_1255_1545_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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 style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1255_1545_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1255_1545_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;Document&nbsp;doc</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Document();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;DisplayCommand&nbsp;display</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DisplayCommand(doc);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;UndoCommand&nbsp;undo</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;UndoCommand(doc);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;RedoCommand&nbsp;redo</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RedoCommand(doc);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;DocumentInvoker&nbsp;invoker</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DocumentInvoker(display,undo,redo);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;invoker.display();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;invoker.undo();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;invoker.redo();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
 <img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/313631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-22 15:21 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>外观模式</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313623.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 22 Feb 2010 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313623.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/313623.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/313623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/313623.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体; color: white; font-size: 32pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="color: #000000; font-size: 12pt"><span style="font-family: 宋体; color: white; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="color: #000000"><span style="font-family: 宋体; font-size: 32pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="font-size: 12pt"><span style="font-family: 宋体; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的外观</span><span style="font-family: Garamond; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">(Facade)</span><span style="font-family: 宋体; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">对象进行。外观模式提供一个高层次的接口，使得子系统更易于使用。</span></span></span></span></span><span style="font-family: 宋体; color: white; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><br />
<span style="font-family: 宋体; color: #000000; font-size: 12pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">在外观模式中，通常只需要一个外观类，并且此外观类只有一个实例，换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个外观类，而仅仅是说对每一个子系统只有一个外观类。或者说，如果一个系统有好几个子系统的话，每一个子系统有一个外观，整个系统可以有数个外观类。</span></span></span></span>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/313623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-22 14:34 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代理模式</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313616.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 22 Feb 2010 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313616.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/313616.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/313616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/313616.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体; color: white; font-size: 32pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="color: #000000; font-size: 12pt"><span style="font-family: 宋体; font-size: 32pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="font-size: 12pt"><span style="font-family: 宋体; color: white; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="color: #000000"><span style="font-family: 宋体; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">代</span></span></span></span><span style="font-size: 12pt"><span style="font-family: 宋体; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">理（</span><span style="font-family: Garamond; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">Proxy</span><span style="font-family: 宋体; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">）模式给某一个对象提供一个代理，并由代理对象控制对原对象的引用.<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><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;Subject<br />
<img id="Codehighlighter1_30_79_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_79_Open_Text.style.display='none'; Codehighlighter1_30_79_Closed_Image.style.display='inline'; Codehighlighter1_30_79_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_30_79_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_30_79_Closed_Text.style.display='none'; Codehighlighter1_30_79_Open_Image.style.display='inline'; Codehighlighter1_30_79_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_30_79_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_30_79_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Request();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RealSubject&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Subject<br />
<img id="Codehighlighter1_122_225_Open_Image" onclick="this.style.display='none'; Codehighlighter1_122_225_Open_Text.style.display='none'; Codehighlighter1_122_225_Closed_Image.style.display='inline'; Codehighlighter1_122_225_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_122_225_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_122_225_Closed_Text.style.display='none'; Codehighlighter1_122_225_Open_Image.style.display='inline'; Codehighlighter1_122_225_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_122_225_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_122_225_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&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;Request()<br />
<img id="Codehighlighter1_163_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_223_Open_Text.style.display='none'; Codehighlighter1_163_223_Closed_Image.style.display='inline'; Codehighlighter1_163_223_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_163_223_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_163_223_Closed_Text.style.display='none'; Codehighlighter1_163_223_Open_Image.style.display='inline'; Codehighlighter1_163_223_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_163_223_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_163_223_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Called&nbsp;RealSubject.Request()</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Proxy&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Subject<br />
<img id="Codehighlighter1_263_658_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_658_Open_Text.style.display='none'; Codehighlighter1_263_658_Closed_Image.style.display='inline'; Codehighlighter1_263_658_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_263_658_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_263_658_Closed_Text.style.display='none'; Codehighlighter1_263_658_Open_Image.style.display='inline'; Codehighlighter1_263_658_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_263_658_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_263_658_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Fields</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;RealSubject&nbsp;realSubject;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&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;Request()<br />
<img id="Codehighlighter1_344_516_Open_Image" onclick="this.style.display='none'; Codehighlighter1_344_516_Open_Text.style.display='none'; Codehighlighter1_344_516_Closed_Image.style.display='inline'; Codehighlighter1_344_516_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_344_516_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_344_516_Closed_Text.style.display='none'; Codehighlighter1_344_516_Open_Image.style.display='inline'; Codehighlighter1_344_516_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_344_516_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_344_516_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Uses&nbsp;"lazy&nbsp;initialization"</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;realSubject&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;)<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realSubject&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RealSubject();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;preRequest();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;realSubject.Request();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;postRequest();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&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;preRequest()<br />
<img id="Codehighlighter1_548_585_Open_Image" onclick="this.style.display='none'; Codehighlighter1_548_585_Open_Text.style.display='none'; Codehighlighter1_548_585_Closed_Image.style.display='inline'; Codehighlighter1_548_585_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_548_585_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_548_585_Closed_Text.style.display='none'; Codehighlighter1_548_585_Open_Image.style.display='inline'; Codehighlighter1_548_585_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_548_585_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_548_585_Open_Text"><span style="color: #000000">{&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">PreRequest.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&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;postRequest()<br />
<img id="Codehighlighter1_618_656_Open_Image" onclick="this.style.display='none'; Codehighlighter1_618_656_Open_Text.style.display='none'; Codehighlighter1_618_656_Closed_Image.style.display='inline'; Codehighlighter1_618_656_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_618_656_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_618_656_Closed_Text.style.display='none'; Codehighlighter1_618_656_Open_Image.style.display='inline'; Codehighlighter1_618_656_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_618_656_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_618_656_Open_Text"><span style="color: #000000">{&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">PostRequest.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></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_681_820_Open_Image" onclick="this.style.display='none'; Codehighlighter1_681_820_Open_Text.style.display='none'; Codehighlighter1_681_820_Closed_Image.style.display='inline'; Codehighlighter1_681_820_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_681_820_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_681_820_Closed_Text.style.display='none'; Codehighlighter1_681_820_Open_Image.style.display='inline'; Codehighlighter1_681_820_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_681_820_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_681_820_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&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(&nbsp;string[]&nbsp;args&nbsp;)<br />
<img id="Codehighlighter1_728_818_Open_Image" onclick="this.style.display='none'; Codehighlighter1_728_818_Open_Text.style.display='none'; Codehighlighter1_728_818_Closed_Image.style.display='inline'; Codehighlighter1_728_818_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_728_818_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_728_818_Closed_Text.style.display='none'; Codehighlighter1_728_818_Open_Image.style.display='inline'; Codehighlighter1_728_818_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_728_818_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_728_818_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;proxy&nbsp;and&nbsp;request&nbsp;a&nbsp;service</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Proxy&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Proxy();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;p.Request();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;</span></div>
</span></span></span></span></span>装饰在于改变目标类，改变是为了变化其状态。<br />
代理在于隐藏目标类，隐藏是为了处理更灵活
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/313616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-22 14:22 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装饰器模式</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313605.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Mon, 22 Feb 2010 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313605.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/313605.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/313605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/313605.html</trackback:ping><description><![CDATA[<span style="font-family: Georgia; font-size: 12pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之，客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下，将对象的功能加以扩展.<br />
<br />
<span style="font-family: 宋体; font-size: 12pt; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">装饰模式使用原来被装饰的类的一个子类的实例，把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展是完全透明的.<br />
<span style="font-family: Garamond; color: white; font-size: 14pt; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-font-kerning: 12.0pt">
<p style="text-align: left; margin-top: 0pt; unicode-bidi: embed; direction: ltr; margin-bottom: 0pt; vertical-align: baseline; language: zh-CN">&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><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;Component<br />
<img id="Codehighlighter1_32_83_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_83_Open_Text.style.display='none'; Codehighlighter1_32_83_Closed_Image.style.display='inline'; Codehighlighter1_32_83_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_32_83_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_32_83_Closed_Text.style.display='none'; Codehighlighter1_32_83_Open_Image.style.display='inline'; Codehighlighter1_32_83_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_32_83_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_32_83_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Operation();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  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;ConcreteComponent&nbsp;&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_138_244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_244_Open_Text.style.display='none'; Codehighlighter1_138_244_Closed_Image.style.display='inline'; Codehighlighter1_138_244_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_138_244_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_138_244_Closed_Text.style.display='none'; Codehighlighter1_138_244_Open_Image.style.display='inline'; Codehighlighter1_138_244_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_138_244_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_138_244_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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_181_242_Open_Image" onclick="this.style.display='none'; Codehighlighter1_181_242_Open_Text.style.display='none'; Codehighlighter1_181_242_Closed_Image.style.display='inline'; Codehighlighter1_181_242_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_181_242_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_181_242_Closed_Text.style.display='none'; Codehighlighter1_181_242_Open_Image.style.display='inline'; Codehighlighter1_181_242_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_181_242_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_181_242_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ConcreteComponent.Operation()</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  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;Decorator&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Component<br />
<img id="Codehighlighter1_296_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_296_539_Open_Text.style.display='none'; Codehighlighter1_296_539_Closed_Image.style.display='inline'; Codehighlighter1_296_539_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_296_539_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_296_539_Closed_Text.style.display='none'; Codehighlighter1_296_539_Open_Image.style.display='inline'; Codehighlighter1_296_539_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_296_539_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_296_539_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Fields</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Component&nbsp;component;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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;SetComponent(&nbsp;Component&nbsp;component&nbsp;)<br />
<img id="Codehighlighter1_409_445_Open_Image" onclick="this.style.display='none'; Codehighlighter1_409_445_Open_Text.style.display='none'; Codehighlighter1_409_445_Closed_Image.style.display='inline'; Codehighlighter1_409_445_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_409_445_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_409_445_Closed_Text.style.display='none'; Codehighlighter1_409_445_Open_Image.style.display='inline'; Codehighlighter1_409_445_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_409_445_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_409_445_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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_476_537_Open_Image" onclick="this.style.display='none'; Codehighlighter1_476_537_Open_Text.style.display='none'; Codehighlighter1_476_537_Closed_Image.style.display='inline'; Codehighlighter1_476_537_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_476_537_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_476_537_Closed_Text.style.display='none'; Codehighlighter1_476_537_Open_Image.style.display='inline'; Codehighlighter1_476_537_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_476_537_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_476_537_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;component&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.Operation();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ConcreteDecoratorA&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Decorator<br />
<img id="Codehighlighter1_50_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_252_Open_Text.style.display='none'; Codehighlighter1_50_252_Closed_Image.style.display='inline'; Codehighlighter1_50_252_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_50_252_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_50_252_Closed_Text.style.display='none'; Codehighlighter1_50_252_Open_Image.style.display='inline'; Codehighlighter1_50_252_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_50_252_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_50_252_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Fields</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;string&nbsp;addedState;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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_135_250_Open_Image" onclick="this.style.display='none'; Codehighlighter1_135_250_Open_Text.style.display='none'; Codehighlighter1_135_250_Closed_Image.style.display='inline'; Codehighlighter1_135_250_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_135_250_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_135_250_Closed_Text.style.display='none'; Codehighlighter1_135_250_Open_Image.style.display='inline'; Codehighlighter1_135_250_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_135_250_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_135_250_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.Operation();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;addedState&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">new&nbsp;state</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ConcreteDecoratorA.Operation()</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  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;ConcreteDecoratorB&nbsp;:&nbsp;Decorator<br />
<img id="Codehighlighter1_302_483_Open_Image" onclick="this.style.display='none'; Codehighlighter1_302_483_Open_Text.style.display='none'; Codehighlighter1_302_483_Closed_Image.style.display='inline'; Codehighlighter1_302_483_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_302_483_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_302_483_Closed_Text.style.display='none'; Codehighlighter1_302_483_Open_Image.style.display='inline'; Codehighlighter1_302_483_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_302_483_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_302_483_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Methods</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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_345_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_345_450_Open_Text.style.display='none'; Codehighlighter1_345_450_Closed_Image.style.display='inline'; Codehighlighter1_345_450_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_345_450_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_345_450_Closed_Text.style.display='none'; Codehighlighter1_345_450_Open_Image.style.display='inline'; Codehighlighter1_345_450_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_345_450_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_345_450_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;base.Operation();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;AddedBehavior();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ConcreteDecoratorB.Operation()</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddedBehavior()<br />
<img id="Codehighlighter1_477_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_477_481_Open_Text.style.display='none'; Codehighlighter1_477_481_Closed_Image.style.display='inline'; Codehighlighter1_477_481_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_477_481_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_477_481_Closed_Text.style.display='none'; Codehighlighter1_477_481_Open_Image.style.display='inline'; Codehighlighter1_477_481_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_477_481_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_477_481_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  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_510_871_Open_Image" onclick="this.style.display='none'; Codehighlighter1_510_871_Open_Text.style.display='none'; Codehighlighter1_510_871_Closed_Image.style.display='inline'; Codehighlighter1_510_871_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_510_871_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_510_871_Closed_Text.style.display='none'; Codehighlighter1_510_871_Open_Image.style.display='inline'; Codehighlighter1_510_871_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_510_871_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_510_871_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&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(&nbsp;String[]&nbsp;args&nbsp;)<br />
<img id="Codehighlighter1_557_869_Open_Image" onclick="this.style.display='none'; Codehighlighter1_557_869_Open_Text.style.display='none'; Codehighlighter1_557_869_Closed_Image.style.display='inline'; Codehighlighter1_557_869_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_557_869_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_557_869_Closed_Text.style.display='none'; Codehighlighter1_557_869_Open_Image.style.display='inline'; Codehighlighter1_557_869_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_557_869_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_557_869_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;ConcreteComponent&nbsp;and&nbsp;two&nbsp;Decorators</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ConcreteComponent&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteComponent();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ConcreteDecoratorA&nbsp;d1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteDecoratorA();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ConcreteDecoratorB&nbsp;d2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConcreteDecoratorB();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Link&nbsp;decorators</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;d1.SetComponent(&nbsp;c&nbsp;);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;d2.SetComponent(&nbsp;d1&nbsp;);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;d2.Operation();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
&nbsp;
<p style="text-align: left; margin-top: 0pt; unicode-bidi: embed; direction: ltr; margin-bottom: 0pt; vertical-align: baseline; language: zh-CN"><span><span style="color: #000000"><span style="color: #000000">&nbsp;<span style="font-family: Garamond; font-size: 32pt; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Garamond; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">1.<span style="mso-tab-count: 1">&nbsp;</span></span></span></span></span></span></span><span style="font-family: Garamond; color: white; font-size: 32pt; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="color: #000000; font-size: 12pt"><span style="font-family: Garamond; color: white; language: en-US; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto"><span style="mso-tab-count: 1"><span style="color: #000000"><span style="font-family: 宋体; language: zh-CN; mso-color-index: 1; mso-ascii-font-family: Garamond; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; text-shadow: auto">需要扩展一个类的功能，或给一个类增加附加责任</span></span></span></span></span></span></span></span></span></span></p>
<span style="font-size: 12pt"><span style="font-size: 8pt"><span style="font-family: Garamond; color: white; font-size: 12pt; language: en-US; text-shadow: auto"><span><span style="color: #000000">2.&nbsp;</span></span></span><span style="font-family: 宋体; color: white; font-size: 32pt; language: zh-CN; text-shadow: auto"><span style="font-size: 12pt"><span style="font-family: 宋体; color: white; language: zh-CN; text-shadow: auto"><span><span style="color: #000000">需要动态地给一个对象增加功能，这些功能可以再动态地撤销</span></span></span><br />
</span></span></span></span></span></span></span>
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/313605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-22 13:41 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/22/313605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式的原则</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/10/312501.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Wed, 10 Feb 2010 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/10/312501.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/312501.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/10/312501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/312501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/312501.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 1、"开－闭"原则——模块应对扩展开放，而对修改关闭。（最最核心的原则）<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; </span></strong>2、里氏代换原则——如果调用的是父类的话，那么换成子类也完全可以运行。里氏代换原则是继承复用的一个基础。<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong>子类 overload方法的访问权限不能小于父类对应方法的访问权限<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; </span></strong>3、合成复用原则——要少用继承，多用合成关系来实现。（合成包括：组合，聚合）<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; </span></strong>4、依赖倒转原则——抽象不应该依赖与细节，细节应当依赖与抽象。 要针对接口编程，而不是针对实现编程。<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong>传递参数，或者在组合聚合关系中，尽量引用层次高的类。<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; </span></strong>5、接口隔离原则——每一个接口应该是一种角色，不多不少，不干不该干的事，该干的事都要干。（单一职责）<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; </span></strong>6、抽象类——好的继承关系中，只有叶节点是具体类，其他节点应该都是抽象类，也就是说具体类是不被继承的。<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong>将尽可能多的共同代码放到抽象类中。<br />
<strong><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; </span></strong>7、迪米特法则——最少知识原则。不要和陌生人说话。
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/312501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-10 13:27 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/10/312501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用filter实现权限管理</title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/04/311941.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Thu, 04 Feb 2010 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/04/311941.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/311941.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/04/311941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/311941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/311941.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 配置文件如下:&nbsp;&nbsp;&nbsp;&lt;filter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;actionrolefilter&lt;/filter-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;Openlot&nbsp;Act...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/04/311941.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/311941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-02-04 13:33 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/02/04/311941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态跟踪Java代码的执行状况工具--BTrace </title><link>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311294.html</link><dc:creator>java/j2ee</dc:creator><author>java/j2ee</author><pubDate>Sat, 30 Jan 2010 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311294.html</guid><wfw:comment>http://www.blogjava.net/zhaozhenlin1224/comments/311294.html</wfw:comment><comments>http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaozhenlin1224/comments/commentRss/311294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaozhenlin1224/services/trackbacks/311294.html</trackback:ping><description><![CDATA[非常强烈的推荐下BTrace这个工具，用了后不得不说太强大了，BTrace简单来说，就是能在不改动当前程序的情况下，运行时的去监控Java程序的执行状况，例如可以做到内存状况的监控、方法调用的监控等等，官方网站上有非常多详细的例子，我不说太多，只在下面举一个简单的例子来说明它的作用，BTrace的User Guide请见：<a href="http://kenai.com/projects/btrace/pages/UserGuide">http://kenai.com/projects/btrace/pages/UserGuide</a>。<br />
对于运行中的Java程序，尤其是出了问题的程序，会需要跟踪其执行状况，例如传入的参数是什么、执行了多少时间，返回的对象是什么，抛出了什么异常，传统的做法只能是把程序改一遍，加上一堆log，一个例子来展示下用BTrace的情况下，怎么来跟踪一个方法的执行时间：<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; border-left-color: #cccccc; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">@BTrace&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;MethodResponseTime&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@TLS&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;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;startTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OnMethod(clazz</span><span style="color: #000000">=</span><span style="color: #000000">"类名</span><span style="color: #000000">"</span><span style="color: #000000">,method</span><span style="color: #000000">=</span><span style="color: #000000">"方法名</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&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;onCall(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(</span><span style="color: #000000">"</span><span style="color: #000000">enter&nbsp;this method</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startTime</span><span style="color: #000000">=</span><span style="color: #000000">timeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OnMethod(clazz</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">类名</span><span style="color: #000000">"</span><span style="color: #000000">,method</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">方法名</span><span style="color: #000000">"</span><span style="color: #000000">,location</span><span style="color: #000000">=</span><span style="color: #000000">@Location(Kind.RETURN))<br />
&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;onReturn(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(</span><span style="color: #000000">"</span><span style="color: #000000">method end!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(strcat(</span><span style="color: #000000">"</span><span style="color: #000000">Time&nbsp;taken&nbsp;ms</span><span style="color: #000000">"</span><span style="color: #000000">,str(timeMillis()</span><span style="color: #000000">-</span><span style="color: #000000">startTime)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
用btrace执行上面的代码，就可以动态的监控任意的目前运行的Java程序中某类的某方法的执行时间，执行上面代码的方式如下（jdk 6+）：<br />
btrace [pid] MethodResponseTime.class<br />
<br />
还有例如获取调用参数、调用者的对象实例以及返回值等请参看User Guide。<br />
<br />
btrace为了保持JVM运行的安全性，因此做了很多的限制，例如不能抛出异常、修改传入的参数的值、修改返回值等，基本是一个只读的动态分析代码运行状况的工具，但仍然是非常的有用，其实现机制是attach api + asm + &nbsp;instrumentation。
<img src ="http://www.blogjava.net/zhaozhenlin1224/aggbug/311294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaozhenlin1224/" target="_blank">java/j2ee</a> 2010-01-30 09:31 <a href="http://www.blogjava.net/zhaozhenlin1224/archive/2010/01/30/311294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>