﻿<?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-非淡泊无以明志，非宁静无以致远--Stay Hungry, Stay Foolish-随笔分类-Programing</title><link>http://www.blogjava.net/jicheng687/category/47754.html</link><description>SET, Python, Java, DB, Arch</description><language>zh-cn</language><lastBuildDate>Thu, 08 Sep 2011 02:46:16 GMT</lastBuildDate><pubDate>Thu, 08 Sep 2011 02:46:16 GMT</pubDate><ttl>60</ttl><item><title>Java基础好文收集</title><link>http://www.blogjava.net/jicheng687/archive/2011/09/01/357743.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Thu, 01 Sep 2011 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/09/01/357743.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/357743.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/09/01/357743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/357743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/357743.html</trackback:ping><description><![CDATA[基础编程<br />Java IO vs NIO:&nbsp;<a href="http://tutorials.jenkov.com/java-nio/nio-vs-io.html">http://tutorials.jenkov.com/java-nio/nio-vs-io.html<br /><br /></a><span>编程</span><span>思想<br />优秀程序员18大原则：</span><a href="http://sd.csdn.net/a/20110729/302424.html">http://sd.csdn.net/a/20110729/302424.html<br /><br /><br /></a>测试相关<br />easyMock教程：<a href="http://skydream.iteye.com/blog/829340">http://skydream.iteye.com/blog/829340</a><img src ="http://www.blogjava.net/jicheng687/aggbug/357743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-09-01 15:38 <a href="http://www.blogjava.net/jicheng687/archive/2011/09/01/357743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Java学习的30个目标以及系统架构师推荐的书</title><link>http://www.blogjava.net/jicheng687/archive/2011/06/18/352581.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sat, 18 Jun 2011 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/06/18/352581.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/352581.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/06/18/352581.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/352581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/352581.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2.你需要学习JAVA语言的基础知识以及它的核心类库 (collections，serialization，streams，networking， multithreading，reflection，event，handling，NIO，localization，以及其他)。&nbsp;&nbsp;<a href='http://www.blogjava.net/jicheng687/archive/2011/06/18/352581.html'>阅读全文</a><img src ="http://www.blogjava.net/jicheng687/aggbug/352581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-06-18 15:25 <a href="http://www.blogjava.net/jicheng687/archive/2011/06/18/352581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dom4j解释XML示例</title><link>http://www.blogjava.net/jicheng687/archive/2011/06/15/352373.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Wed, 15 Jun 2011 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/06/15/352373.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/352373.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/06/15/352373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/352373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/352373.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/jicheng687/archive/2011/06/15/352373.html'>阅读全文</a><img src ="http://www.blogjava.net/jicheng687/aggbug/352373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-06-15 17:53 <a href="http://www.blogjava.net/jicheng687/archive/2011/06/15/352373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visitor模式和Double Dispatch</title><link>http://www.blogjava.net/jicheng687/archive/2011/05/24/350937.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Tue, 24 May 2011 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/05/24/350937.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/350937.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/05/24/350937.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/350937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/350937.html</trackback:ping><description><![CDATA[<br />一、概念<br />&nbsp; 静态分派（Static Dispatch），发生在编译时期，分派是根据静态类型信息发生的，方法重载就是静态分派。<br />&nbsp; 动态分派（Dynamic Dispatch），发生在运行时期，动态分派动态地置换掉某个方法。面向对象的语言用动态分派实现多态性。<br />&nbsp; Java语言支持静态多分派和动态的单分派，利用设计模式Java可以实现Double Dispatch，即访问者模式。<br /><br />二、Visitor Pattern<br />&nbsp; 目的：封装一些施加于某种数据结构元素之上的操作。<br />&nbsp; UML图：<br />&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jicheng687/visitorPattern.jpg" width="640" longdesc="" height="346" /><br />&nbsp;&nbsp; 主要原理：&#8220;反传球&#8221;，Element来Visitor之间二轮调用，调用过程中用sinlge dispatch确定类型<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp; <br /><img src ="http://www.blogjava.net/jicheng687/aggbug/350937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-05-24 16:54 <a href="http://www.blogjava.net/jicheng687/archive/2011/05/24/350937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CyclicBarrier in Java</title><link>http://www.blogjava.net/jicheng687/archive/2011/05/07/349740.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sat, 07 May 2011 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/05/07/349740.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/349740.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/05/07/349740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/349740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/349740.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other. The barrier is called cyclic because it can be re-used after the waiting threads are released.&nbsp;&nbsp;<a href='http://www.blogjava.net/jicheng687/archive/2011/05/07/349740.html'>阅读全文</a><img src ="http://www.blogjava.net/jicheng687/aggbug/349740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-05-07 15:35 <a href="http://www.blogjava.net/jicheng687/archive/2011/05/07/349740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CountDownLatch  in Java</title><link>http://www.blogjava.net/jicheng687/archive/2011/05/07/349739.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sat, 07 May 2011 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/05/07/349739.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/349739.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/05/07/349739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/349739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/349739.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:   A java.util.concurrent.CountDownLatch is a concurrency construct that allows one or more threads to wait for a given set of operations to complete&nbsp;&nbsp;<a href='http://www.blogjava.net/jicheng687/archive/2011/05/07/349739.html'>阅读全文</a><img src ="http://www.blogjava.net/jicheng687/aggbug/349739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-05-07 15:10 <a href="http://www.blogjava.net/jicheng687/archive/2011/05/07/349739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Multithreaded Servers in Java</title><link>http://www.blogjava.net/jicheng687/archive/2011/05/07/349725.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sat, 07 May 2011 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/05/07/349725.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/349725.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/05/07/349725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/349725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/349725.html</trackback:ping><description><![CDATA[文章描述了实现 Multithreaded Servers的3种方法：<br />
1）单线程，性能性差，请求等待时间长<br />
2）多线程，把接受请求和处理请求的线程分开，接受后交给 worker处理<br />
3）线程池，性能最佳，有效地防止负载过重，重复利用线程，请求多时，让请求排队接收处理<br />
4）主要用socket来通信， ServerSocket 和 Socket<br />
<br />
具体文章请看：http://tutorials.jenkov.com/java-multithreaded-servers/index.html 
<img src ="http://www.blogjava.net/jicheng687/aggbug/349725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-05-07 09:58 <a href="http://www.blogjava.net/jicheng687/archive/2011/05/07/349725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回调机制</title><link>http://www.blogjava.net/jicheng687/archive/2011/04/29/349300.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Fri, 29 Apr 2011 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/04/29/349300.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/349300.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/04/29/349300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/349300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/349300.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 软件模块之间总是存在着一定的接口，从调用方式上，可以把他们分为三类：同步调用、回调和异步调用。<br>同步调用是一种阻塞式调用，调用方要等待对方执行完毕才返回，它是一种单向调用，如HTTP；<br>回调是一种双向调用模式，也就是说，被调用方在接口被调用时也会调用对方的接口；<br>异步调用是一种类似消息或事件的机制，不过它的调用方向刚好相反，接口的服务在收到某种讯息或发生某种事件时，会主动通知客户方（即调用客户方的接口），如JMS；<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/jicheng687/archive/2011/04/29/349300.html'>阅读全文</a><img src ="http://www.blogjava.net/jicheng687/aggbug/349300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-04-29 22:36 <a href="http://www.blogjava.net/jicheng687/archive/2011/04/29/349300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】关于多线程编程您不知道的 5 件事</title><link>http://www.blogjava.net/jicheng687/archive/2011/04/28/349176.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Thu, 28 Apr 2011 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/04/28/349176.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/349176.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/04/28/349176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/349176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/349176.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 虽然很少有 Java™ 开发人员能够忽视多线程编程和支持它的 Java 平台库，更少有人有时间深入研究线程。相反地，我们临时学习线程，在需要时向我们的工具箱添加新的技巧和技术。以这种方式构建和运行适当的应用程序是可行的，但是您可以做的不止这些。理解 Java 编译器的线程处理特性和 JVM 将有助于您编写更高效、性能更好的 Java 代码&nbsp;&nbsp;<a href='http://www.blogjava.net/jicheng687/archive/2011/04/28/349176.html'>阅读全文</a><img src ="http://www.blogjava.net/jicheng687/aggbug/349176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-04-28 11:59 <a href="http://www.blogjava.net/jicheng687/archive/2011/04/28/349176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python设计的核心理念</title><link>http://www.blogjava.net/jicheng687/archive/2011/04/18/348465.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Mon, 18 Apr 2011 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/04/18/348465.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/348465.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/04/18/348465.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/348465.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/348465.html</trackback:ping><description><![CDATA[<p>The Zen of Python, by Tim Peters</p>
<p>Beautiful is better than ugly.<br />
Explicit is better than implicit.<br />
Simple is better than complex.<br />
Complex is better than complicated.<br />
Flat is better than nested.<br />
Sparse is better than dense.<br />
Readability counts.<br />
Special cases aren't special enough to break the rules.<br />
Although practicality beats purity.<br />
Errors should never pass silently.<br />
Unless explicitly silenced.<br />
In the face of ambiguity, refuse the temptation to guess.<br />
There should be one-- and preferably only one --obvious way to do it.<br />
Although that way may not be obvious at first unless you're Dutch.<br />
Now is better than never.<br />
Although never is often better than *right* now.<br />
If the implementation is hard to explain, it's a bad idea.<br />
If the implementation is easy to explain, it may be a good idea.<br />
Namespaces are one honking great idea -- let's do more of those!</p>
<img src ="http://www.blogjava.net/jicheng687/aggbug/348465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-04-18 09:10 <a href="http://www.blogjava.net/jicheng687/archive/2011/04/18/348465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java集合框架比较</title><link>http://www.blogjava.net/jicheng687/archive/2011/03/07/345879.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Mon, 07 Mar 2011 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/03/07/345879.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/345879.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/03/07/345879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/345879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/345879.html</trackback:ping><description><![CDATA[<br />
&nbsp;
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left"><span style="font-family: 宋体">数组类</span>Array<span style="font-family: 宋体">是</span>Java<span style="font-family: 宋体">中最基本的一个存储结构。它用于存储一组连续的对象或基本类型的数据。其中的元素的类型必须相同。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">Array<span style="font-family: 宋体">是最有效率的一</span> <span style="font-family: 宋体">种：</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">1<span style="font-family: 宋体">、效率高，但容量固定且无法动态改变。</span> Array<span style="font-family: 宋体">还有一个缺点是，无法判断其中实际存有多少元素，</span>length<span style="font-family: 宋体">只是告诉我们</span>Array<span style="font-family: 宋体">的容量。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">2<span style="font-family: 宋体">、</span>Java<span style="font-family: 宋体">中有一个</span>Arrays<span style="font-family: 宋体">类，专门用来操作</span>Array<span style="font-family: 宋体">，提供搜索、排序、复制等静态方法。</span> equals()<span style="font-family: 宋体">：比较两个</span>Array<span style="font-family: 宋体">是否相等，</span>Array<span style="font-family: 宋体">拥有相同元素个数，且所有对应元素两两相等。</span> fill()<span style="font-family: 宋体">：将值填入</span>Array<span style="font-family: 宋体">中。</span> sort()<span style="font-family: 宋体">：用来对</span>Array<span style="font-family: 宋体">进行排序。</span> binarySearch()<span style="font-family: 宋体">：在排好序的</span>Array<span style="font-family: 宋体">中寻找元素。</span> System.arraycopy()<span style="font-family: 宋体">：</span>Array<span style="font-family: 宋体">的复制。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">Java Collections Framework<span style="font-family: 宋体">成员主要包括两种类型，即：</span>Collection<span style="font-family: 宋体">和</span>Map<span style="font-family: 宋体">类型。</span> <span style="font-family: 宋体">在</span>Java<span style="font-family: 宋体">中提供了</span>Collection<span style="font-family: 宋体">和</span>Map<span style="font-family: 宋体">接口。其中</span>List<span style="font-family: 宋体">和</span>Set<span style="font-family: 宋体">继承了</span>Collection<span style="font-family: 宋体">接口；</span>Vector<span style="font-family: 宋体">、</span>ArrayList<span style="font-family: 宋体">、</span> LinkedList<span style="font-family: 宋体">三个类实现</span>List<span style="font-family: 宋体">接口，</span>HashSet<span style="font-family: 宋体">、</span>TreeSet<span style="font-family: 宋体">实现</span>Set<span style="font-family: 宋体">接口，</span>HashTable<span style="font-family: 宋体">、</span>HashMap<span style="font-family: 宋体">、</span> TreeMap<span style="font-family: 宋体">实现</span>Map<span style="font-family: 宋体">接口。由此可见，</span>Java<span style="font-family: 宋体">中用</span>8<span style="font-family: 宋体">种类型的基本数据结构来实现其</span>Collections Framework<span style="font-family: 宋体">；下面分别进行介绍。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">Vector<span style="font-family: 宋体">：基于</span>Array<span style="font-family: 宋体">的</span>List<span style="font-family: 宋体">，性能也就不可能超越</span>Array<span style="font-family: 宋体">，并且</span><span style="color: red">Vector</span><span style="font-family: 宋体; color: red">是</span><span style="color: red">"sychronized"</span><span style="font-family: 宋体; color: red">的</span><span style="font-family: 宋体">，这个也是</span>Vector<span style="font-family: 宋体">和</span>ArrayList<span style="font-family: 宋体">的唯一的区别。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">ArrayList<span style="font-family: 宋体">：同</span>Vector<span style="font-family: 宋体">一样是一个基于</span>Array<span style="font-family: 宋体">的，但是不同的是</span>ArrayList<span style="font-family: 宋体; color: red">不是同步的</span><span style="font-family: 宋体">。所以在性能上要比</span>Vector<span style="font-family: 宋体">优越一些，但</span> <span style="font-family: 宋体">是当运行到多线程环境中时，可需要自己在管理线程的同步问题。从其命名中可以看出它是一种类似数组的形式进行存储，因此它的随机访问速度极快。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">LinkedList<span style="font-family: 宋体">：</span>LinkedList<span style="font-family: 宋体">不同于前面两种</span>List<span style="font-family: 宋体">，它不是基于</span>Array<span style="font-family: 宋体">的，所以不受</span>Array<span style="font-family: 宋体">性能的限制。它每一个节点（</span>Node<span style="font-family: 宋体">）</span> <span style="font-family: 宋体">都包含两方面的内容：</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">1<span style="font-family: 宋体">、节点本身的数据（</span>data<span style="font-family: 宋体">）；</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">2<span style="font-family: 宋体">、下一个节点的信息（</span>nextNode<span style="font-family: 宋体">）。所以当对</span>LinkedList<span style="font-family: 宋体">做添加，删除动作的时候</span> <span style="font-family: 宋体">就不用像基于</span>Array<span style="font-family: 宋体">的</span>List<span style="font-family: 宋体">一样，必须进行大量的数据移动。只要更改</span>nextNode<span style="font-family: 宋体">的相关信息就可以实现了所以它适合于进行频繁进行插入和删除操</span> <span style="font-family: 宋体">作。这就是</span>LinkedList<span style="font-family: 宋体">的优势。</span>Iterator<span style="font-family: 宋体">只能对容器进行向前遍历，而</span> ListIterator<span style="font-family: 宋体">则继承了</span>Iterator<span style="font-family: 宋体">的思想，并提供了对</span>List<span style="font-family: 宋体">进行双向遍历的方法。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">List<span style="font-family: 宋体">总结：</span> </p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">1<span style="font-family: 宋体">、所有的</span>List<span style="font-family: 宋体">中只能容纳单个不同类型的对象组成的表，而不是</span>Key<span style="font-family: 宋体">－</span>Value<span style="font-family: 宋体">键值对。例如：</span>[ tom,1,c ]<span style="font-family: 宋体">；</span> </p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">2<span style="font-family: 宋体">、所有的</span>List<span style="font-family: 宋体">中可以有相同的元素，例如</span>Vector<span style="font-family: 宋体">中可以有</span> [ tom,koo,too,koo ]<span style="font-family: 宋体">；</span> </p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">3<span style="font-family: 宋体">、所有的</span>List<span style="font-family: 宋体">中可以有</span>null<span style="font-family: 宋体">元素，例如</span>[ tom,null,1 ]<span style="font-family: 宋体">；</span> </p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left"><span style="color: red">4</span><span style="font-family: 宋体; color: red">、基于</span><span style="color: red">Array</span><span style="font-family: 宋体; color: red">的</span><span style="color: red">List</span><span style="font-family: 宋体; color: red">（</span><span style="color: red">Vector</span><span style="font-family: 宋体; color: red">，</span><span style="color: red">ArrayList</span><span style="font-family: 宋体; color: red">）适合查询，而</span><span style="color: red">LinkedList</span><span style="font-family: 宋体; color: red">（链表）适合添加，删除操作</span><span style="font-family: 宋体">。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">HashSet<span style="font-family: 宋体">：虽然</span>Set<span style="font-family: 宋体">同</span>List<span style="font-family: 宋体">都实现了</span>Collection<span style="font-family: 宋体">接口，但是他们的实现方式却大不一样。</span>List<span style="font-family: 宋体">基本上都是以</span>Array<span style="font-family: 宋体">为基础。但是</span> Set<span style="font-family: 宋体">则是在</span>HashMap<span style="font-family: 宋体">的基础上来实现的，这个就是</span>Set<span style="font-family: 宋体">和</span>List<span style="font-family: 宋体">的根本区别。</span>HashSet<span style="font-family: 宋体">的存储方式是把</span>HashMap<span style="font-family: 宋体">中的</span>Key<span style="font-family: 宋体">作为</span>Set<span style="font-family: 宋体">的</span> <span style="font-family: 宋体">对应存储项，这也是为什么在</span>Set<span style="font-family: 宋体">中不能像在</span>List<span style="font-family: 宋体">中一样有重复的项的根本原因，因为</span>HashMap<span style="font-family: 宋体">的</span>key<span style="font-family: 宋体">是不能有重复的。</span>HashSet<span style="font-family: 宋体">能快速定位</span> <span style="font-family: 宋体">一个元素，但是放到</span>HashSet<span style="font-family: 宋体">中的对象需要实现</span>hashCode()<span style="font-family: 宋体">方法</span>0<span style="font-family: 宋体">。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">TreeSet<span style="font-family: 宋体">则将放入其中的元素按序存放，这就要求你放入其中的对象是可排序的，这就用到了集合框架提供的另外两个实用类</span>Comparable<span style="font-family: 宋体">和</span> Comparator<span style="font-family: 宋体">。一个类是可排序的，它就应该实现</span>Comparable<span style="font-family: 宋体">接口。有时多个类具有相同的排序算法，那就不需要重复定义相同的排序算法，只要实现</span>Comparator<span style="font-family: 宋体">接口即可。</span>TreeSet<span style="font-family: 宋体">是</span>SortedSet<span style="font-family: 宋体">的子类，它不同于</span>HashSet<span style="font-family: 宋体">的根本就是</span>TreeSet<span style="font-family: 宋体">是有序的。它是通过</span>SortedMap<span style="font-family: 宋体">来实现的。</span> </p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">Set<span style="font-family: 宋体">总结：</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">1<span style="font-family: 宋体">、</span>Set<span style="font-family: 宋体">实现的基础是</span>Map<span style="font-family: 宋体">（</span>HashMap<span style="font-family: 宋体">）；</span> </p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">2<span style="font-family: 宋体">、</span>Set<span style="font-family: 宋体">中的元素是不能重复的，如果使用</span>add(Object obj)<span style="font-family: 宋体">方法添加已经存在的对象，则会覆盖前面的对象；</span> Set<span style="font-family: 宋体">里的元素是不能重复的，那么用什么方法来区分重复与否呢</span>? <span style="font-family: 宋体">是用</span>==<span style="font-family: 宋体">还是</span>equals()? <span style="font-family: 宋体">它们有何区别</span>? Set<span style="font-family: 宋体">里的元素是不能重复的，即不能包含两个元素</span>e1<span style="font-family: 宋体">、</span>e2<span style="font-family: 宋体">（</span>e1.equals<span style="font-family: 宋体">（</span>e2<span style="font-family: 宋体">））。那么用</span>iterator()<span style="font-family: 宋体">方法来区分重复与否。</span> equals()<span style="font-family: 宋体">是判读两个</span>Set<span style="font-family: 宋体">是否相等。</span>==<span style="font-family: 宋体">方法决定引用值</span>(<span style="font-family: 宋体">句柄</span>)<span style="font-family: 宋体">是否指向同一对象。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">HashMap<span style="font-family: 宋体">、</span>TreeMap<span style="font-family: 宋体">、</span>Hashtable<span style="font-family: 宋体">：</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">1<span style="font-family: 宋体">、</span>HashMap<span style="font-family: 宋体">也用到了哈希码的算法，以便快速查找一个键，</span>TreeMap<span style="font-family: 宋体">则是对键按序存放，因此它有一些扩展的方法，比如</span> firstKey(),lastKey()<span style="font-family: 宋体">等。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">2<span style="font-family: 宋体">、</span>Hashtable<span style="font-family: 宋体">：不允许空（</span>null<span style="font-family: 宋体">）键（</span>key<span style="font-family: 宋体">）或值（</span>value<span style="font-family: 宋体">），</span>Hashtable<span style="font-family: 宋体">的方法是</span>Synchronize<span style="font-family: 宋体">的，在多个线程访问</span> Hashtable<span style="font-family: 宋体">时，不需要自己为它的方法实现同步，而</span>HashMap <span style="font-family: 宋体">就必须为之提供外同步。</span> Hashtable<span style="font-family: 宋体">和</span>HashMap<span style="font-family: 宋体">采用的</span>hash/rehash<span style="font-family: 宋体">算法都大概一样，所以性能不会有很大的差异。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">3<span style="font-family: 宋体">、</span>HashMap<span style="font-family: 宋体">和</span>Hashtable<span style="font-family: 宋体">的区别：</span>HashMap<span style="font-family: 宋体">是</span>Hashtable(<span style="font-family: 宋体">线程案例的</span>)<span style="font-family: 宋体">的轻量级实现（非线程安全的实现），他们都完成了</span>Map<span style="font-family: 宋体">接口。主要区别在于</span><span style="color: red">HashMap</span><span style="font-family: 宋体; color: red">允许空（</span><span style="color: red">null</span><span style="font-family: 宋体; color: red">）键</span><span style="font-family: 宋体; color: red">（</span><span style="color: red">key</span><span style="font-family: 宋体; color: red">）或值（</span><span style="color: red">value</span><span style="font-family: 宋体; color: red">）</span><span style="color: red">,</span><span style="font-family: 宋体">非同步，由于非线程安全，效率上可能高于</span>Hashtable<span style="font-family: 宋体">。</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left">Map<span style="font-family: 宋体">总结：</span></p>
<p style="text-align: left; text-indent: 21pt" class="MsoNormal" align="left"><span style="font-family: 宋体">是一种把键对象和值对象进行关联的容器，</span>Map<span style="font-family: 宋体">有两种比较常用的实现：</span> HashTable<span style="font-family: 宋体">、</span>HashMap<span style="font-family: 宋体">和</span>TreeMap<span style="font-family: 宋体">。</span></p>
<img src ="http://www.blogjava.net/jicheng687/aggbug/345879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-03-07 14:25 <a href="http://www.blogjava.net/jicheng687/archive/2011/03/07/345879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java设计模式总结</title><link>http://www.blogjava.net/jicheng687/archive/2011/02/21/344787.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Mon, 21 Feb 2011 15:40:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/02/21/344787.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/344787.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/02/21/344787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/344787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/344787.html</trackback:ping><description><![CDATA[<p>一、写在前面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开学，趁着有时间把设计模式重新整理一次。学好设计模式是走向架构的第一步，系统架构应该朝着可维护，可扩展，强壮性好的方向去发展。大学的最后一个学期了，时间不多了，3月初就要去腾讯实习了，还有毕设。加油 ：）<br />
<br />
二、常见的模式分类<br />
<font style="background-color: #cce8cf">&nbsp;
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体; color: red">创建模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体; color: red">结构模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体; color: red">行为模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">简单工厂模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">适配器模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">不变模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">工厂方法模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">缺省适配模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">策略模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">抽象工厂模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">合成模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">模版方法模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">单例模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">装饰模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">观察者模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">多例模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">代理模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">迭代子模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">建造模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">享元模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">责任链模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">原始模型模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">门面模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">命令模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">桥梁模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">备忘录模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">状态模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">访问者模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">解释器模式</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189"></td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">调停者模式</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
三、主要模式的定义和描述<br />
以下内容来自《head first 设计模式》一书<br />
&nbsp;
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体; color: red">模式</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体; color: red">定义</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体; color: red">描述</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">装饰者</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">动态地将责任附加到对象上。若要扩展功能，装饰者提供了比继承更有弹性的替代方案</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">包装一个对象，以提供新的行为</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">状态</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">允许对象在内部状态改变时改变它的行为，对象看起来好像修改了它的类</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">封装了基本状态的行为，并使用委托在行为之间切换</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">迭代器</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">提供一种方法顺序访问一个聚合对象中的各个元素，而又不暴露其内部的表示</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">在对象的集合之中游走，而不暴露集合的实现</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">外观（门面）</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">提供一个统一的接口，用来访问子系统中的一群接口。外观定义了一个高层接口，让子系统更多容易使用</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">简化一群类的接口</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">策略</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">定义算法族，分别封装起来，让它们之间可以互相替换，此模式让算法的变化独立于使用算法的客户</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">封装可以互换的行为，并使用委托来决定使用那一种</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">代理</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">为另一个对象提供一个替身或点位符以访问这个对象</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">包装对象，以控制对此对象的访问</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">工厂方法</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">定义了一个创建对象的接口，但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">由子类决定要创建是具体类是哪一个</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">抽象工厂</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">提供一个接口，用于创建相关或依赖对象的家族，而不需要明确指定具体类</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">允许客户创建对象的家族，而无需指定他们的具体类</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">适配器</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">将一个类的接口，转换成客户期望另一个接口。适配器让原来不兼容的类可以合作无间</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">封装对象，并提供不同的接口</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">观察者</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">在对象之间定义一对多的依赖，这样一来，当一个对象改变时，依赖它的对象都会收到通知并自动更新</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">让对象能够在状态改变时被通知</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">模板方法</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">在一个方法中定义一个算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下，重新定义算法中的某些步骤</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">由子类决定如何实现一个算法中的步骤</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">组合</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">允许你将对象组成树结构来表现&#8220;整体</span>/<span style="font-family: 宋体">部分&#8221;的层次结构。组合能让客户以一致的方式处理个别对象和对象组合</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">客户用一致的方式处理对象集合和单个对象</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">单件（单体）</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">确保一个类只有一个实例，并提供全局访问点</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">确保只有一个对象被创建</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">命令</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">将请求封装成对象，这可以让你使用不同的请求、队列，或者日志请求来参数化其它对象。命令模式也可以支持撤销操作</span></p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: medium none; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="189">
            <p><span style="font-family: 宋体">封装请求为对象</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp; 四、参考资料<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBM社区设计模式方面资料： <font style="background-color: #cce8cf"><a href="http://www.ibm.com/developerworks/cn/java/design/">http://www.ibm.com/developerworks/cn/java/design/</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;常见OO原则：<font style="background-color: #cce8cf"><a href="http://www.blogjava.net/jicheng687/archive/2011/02/13/344174.html"><font style="background-color: #cce8cf">http://www.blogjava.net/jicheng687/archive/2011/02/13/344174.html</font><br />
</a></font></font><br />
</font></p>
--END-- 
<img src ="http://www.blogjava.net/jicheng687/aggbug/344787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-02-21 23:40 <a href="http://www.blogjava.net/jicheng687/archive/2011/02/21/344787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【JUnit源码解读】--观察者模式</title><link>http://www.blogjava.net/jicheng687/archive/2011/02/15/344321.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Tue, 15 Feb 2011 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/02/15/344321.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/344321.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/02/15/344321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/344321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/344321.html</trackback:ping><description><![CDATA[<span style="background-color: #000000"><span><span style="background-color: #000000"><span style="background-color: #000000"><span style="background-color: #ffffff">一、观察者模式定义<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="background-color: #cce8cf">观察者模式(Observer): 在对象之间定义一对多的依赖，这样一来，当一个对象改变状态，依赖它的对象都会收到通知，并自动更新</font><br />
<br />
二、在JUnit中的体现</span></span><br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jicheng687/JUnit-observer.png" /><br />
<br />
<span><span style="background-color: #ffffff">TestResult中用Vector保存各个监听器（文本界面、图形界面和Eclipse插件）<br />
</span></span></span>
<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"><span style="background-color: #000000"><span><span style="background-color: #ffffff"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Vector&nbsp;fListeners;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">监听器集合</span></span></span></span></div>
<br />
<span style="background-color: #000000"><span><span style="background-color: #ffffff">在测试运行阶段，如果出现Error 或者 Failure,TestResult 则会通知各个监听器<br />
</span></span></span>
<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_71_309_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_309_Open_Text.style.display='none'; Codehighlighter1_71_309_Closed_Image.style.display='inline'; Codehighlighter1_71_309_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_71_309_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_71_309_Closed_Text.style.display='none'; Codehighlighter1_71_309_Open_Image.style.display='inline'; Codehighlighter1_71_309_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addFailure(Test&nbsp;test,&nbsp;AssertionFailedError&nbsp;t)&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_71_309_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_71_309_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;&nbsp;&nbsp;&nbsp;fFailures.addElement(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestFailure(test,&nbsp;t));<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">观察者模式在这里体现出来了，当fFailures有变化时，马上通知其它Listeners</span><span style="color: #008000"><br />
<img id="Codehighlighter1_246_306_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_306_Open_Text.style.display='none'; Codehighlighter1_246_306_Closed_Image.style.display='inline'; Codehighlighter1_246_306_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_246_306_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_246_306_Closed_Text.style.display='none'; Codehighlighter1_246_306_Open_Image.style.display='inline'; Codehighlighter1_246_306_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Enumeration&nbsp;e</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cloneListeners().elements();&nbsp;e.hasMoreElements();&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_246_306_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_246_306_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((TestListener)e.nextElement()).addFailure(test,&nbsp;t);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/jicheng687/aggbug/344321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-02-15 10:33 <a href="http://www.blogjava.net/jicheng687/archive/2011/02/15/344321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Junit源码解读】--概括</title><link>http://www.blogjava.net/jicheng687/archive/2011/02/13/344198.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sun, 13 Feb 2011 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/02/13/344198.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/344198.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/02/13/344198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/344198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/344198.html</trackback:ping><description><![CDATA[<font style="background-color: #000000; color: #000000" size="+0">
<p><font style="background-color: #cce8cf">一、在单元测试领域里，JUnit可以说是王者，它不但精致，而且使用方便。最后有些时间，把JUnit源码读读，顺便复习下设计模式 ：）</font></p>
<p><font style="background-color: #cce8cf">二、参考文章<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在深入看代码之前，先看下面的文章，对JUnit有一个基本的了解后，看代码会更有目的性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JUnit官方网站：<a href="http://www.junit.org">http://www.junit.org</a>/&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分析 JUnit 框架源代码：&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-lo-junit-src/">http://www.ibm.com/developerworks/cn/java/j-lo-junit-src/<br />
</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JUnit A cook's tour:&nbsp; <a href="http://junit.sourceforge.net/doc/cookstour/cookstour.htm">http://junit.sourceforge.net/doc/cookstour/cookstour.htm</a><br />
<br />
三、核心架构<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我分析的源码的版本是JUnit 3.8.2，这个版本相对简略，把核心思想表现出来了，没有4.X版本那么多附加的功能<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JUnit是一个模式密集型的框架，主要用组合模式、模样方法、观察者模式、参数收集方法、命令模式、装饰者模式和适配器模式。其中核心是&nbsp; 前三种<br />
<br />
<br />
核心类之间的关系<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jicheng687/Junit1.png" width="768" height="480" /><br />
<br />
<font style="background-color: #cce8cf">Test、TestCase和TestSuit构成了测试框架的基础，它们用composite模式组合在一起，使得客户端可以将对象的集合以及个别的对象(TestCase)一视同仁.TestRusult用来保存测试结果，和TestListner组成observer模式，支持文本界面、图形界面和 Eclipse 集成组件三种监听器</font><br />
和JUnit A cook's tour中提到的模式图很相似<br />
<img border="0" alt="" src="http://junit.sourceforge.net/doc/cookstour/Image6.gif" width="605" height="394" /><br />
</font></p>
<p style="color: #000000"><span style="background-color: #ffffff">类与类之间的关系在此就不作解释了，可以看看参考文章。有兴趣的朋友，欢迎一起讨论 ：）</span><font style="background-color: #cce8cf"><br />
</font></p>
</font>
<img src ="http://www.blogjava.net/jicheng687/aggbug/344198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-02-13 17:09 <a href="http://www.blogjava.net/jicheng687/archive/2011/02/13/344198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见的OO原则</title><link>http://www.blogjava.net/jicheng687/archive/2011/02/13/344174.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sun, 13 Feb 2011 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/02/13/344174.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/344174.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/02/13/344174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/344174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/344174.html</trackback:ping><description><![CDATA[<p><span><span>封装变化</span></span></p>
<p><span><span>多用组合，少用继承</span></span></p>
<p><span><span>针对接口编程，不针对实现编程</span></span></p>
<p><span><span>为交互对象之间的松耦合设计而努力</span></span></p>
<p><span><span>类应该对扩展开放，对修改关闭</span></span></p>
<p><span><span>只和朋友交谈</span></span></p>
<p><span><span>别找我，我会找你</span></span></p>
<p><span><span>类应该只有一个改变的理由</span></span></p>
 <img src ="http://www.blogjava.net/jicheng687/aggbug/344174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-02-13 10:23 <a href="http://www.blogjava.net/jicheng687/archive/2011/02/13/344174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Effective Java】--异常</title><link>http://www.blogjava.net/jicheng687/archive/2011/02/12/344158.html</link><dc:creator>步步为营</dc:creator><author>步步为营</author><pubDate>Sat, 12 Feb 2011 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/jicheng687/archive/2011/02/12/344158.html</guid><wfw:comment>http://www.blogjava.net/jicheng687/comments/344158.html</wfw:comment><comments>http://www.blogjava.net/jicheng687/archive/2011/02/12/344158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jicheng687/comments/commentRss/344158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jicheng687/services/trackbacks/344158.html</trackback:ping><description><![CDATA[<font style="color: #000000">
<p>38、只针对不正常的条件使用异常<br />
异常只应该被用于不正常的条件，它们永远不应该被用于不正常的条件<br />
设计API启示：一个良好的API不应该强迫它的客户为了正常的控制流而使用异常。对于边界的判断常用的有两种方法：状态测试方法和可被识别的返回值</p>
<p><br />
40、对于可以恢复的条件使用被检查的异常，对于程序错误使用运行时异常<br />
&nbsp;Thowable（可抛出异常）有三种结构：被检查的异常(checked exception)、运行时异常（run-time exception)和错误(error)<br />
如果期望调用者能够恢复，那么，对于这样的条件应该使用被检查的异常<br />
运行时异常和错误，不需要也不应该是被捕获的抛出物<br />
用运行时异常来指明程序错误<br />
对于被检查的异常，提供一些辅助方法是非常重要的，通过这些方法，调用者可以获得一些有助于恢复的信息</p>
<p><br />
41、避免不必要地使用被检查的异常<br />
</p>
<p>42、尽量使用标准异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><br />
43、抛出的异常要适合于相应的抽象<br />
高层的实现应该捕获低层的异常，同时导出一个可以按照高层抽象进行解释的---异常转译<br />
低层的异常对于调试该异常被拨出的情形非常有帮助的话，可以使用异常链接。即低层的异常被高层的异常保存起来，并且高层的异常提供一个公有的访问方法来获得低层异常</p>
<p>44、每个异常的抛出都必须有文档 </p>
<p>45、在细节消息中包含失败--捕获信息<br />
为了捕获失败，一个异常的的字符串表示应该包含所有&#8220;对异常有贡献&#8221;的参数和域的值 <br />
在异常构造函数中以参数形式引入这些信息</p>
<p><br />
46、努力使失败保持原子性<br />
一个失败方法调用应该使用对象保持&#8220;它在被调用之前的状态&#8221; ---failure atomic<br />
几种解决方法：在执行操作之前检查参数的有效性<br />
调整计算机过程，使得任何可能会失败的计算部分发生在对象状态被修改之前 <br />
编写一段恢复代码<br />
在对象上临时都拷贝一份，当操作完成之后把临时拷贝中的结果复制给原来的对象。如：Collections.sort</p>
<p>47、不要忽略异常<br />
写上try catch块</p>
</font>
<img src ="http://www.blogjava.net/jicheng687/aggbug/344158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jicheng687/" target="_blank">步步为营</a> 2011-02-12 18:02 <a href="http://www.blogjava.net/jicheng687/archive/2011/02/12/344158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>