﻿<?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-myjava-文章分类-jdk代码分析</title><link>http://www.blogjava.net/zhqh/category/33755.html</link><description>myjava</description><language>zh-cn</language><lastBuildDate>Wed, 12 Oct 2011 01:58:06 GMT</lastBuildDate><pubDate>Wed, 12 Oct 2011 01:58:06 GMT</pubDate><ttl>60</ttl><item><title>liferay</title><link>http://www.blogjava.net/zhqh/articles/liferay.html</link><dc:creator>zhqh</dc:creator><author>zhqh</author><pubDate>Mon, 10 Oct 2011 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/zhqh/articles/liferay.html</guid><wfw:comment>http://www.blogjava.net/zhqh/comments/360400.html</wfw:comment><comments>http://www.blogjava.net/zhqh/articles/liferay.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhqh/comments/commentRss/360400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhqh/services/trackbacks/360400.html</trackback:ping><description><![CDATA[<p>navigation.vm:<br />&lt;nav class="doc-nav nav-x"&gt;<br />&nbsp;&lt;ul&gt;<br />&nbsp;&nbsp;#foreach ($nav_item in $nav_items)<br />&nbsp;&nbsp;&nbsp;#if ($nav_item.isSelected())<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="f sel"&gt;<br />&nbsp;&nbsp;&nbsp;#else<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;<br />&nbsp;&nbsp;&nbsp;#end</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="$nav_item.getURL()" $nav_item.getTarget()&gt;&lt;span&gt;$nav_item.icon() $htmlUtil.escape($nav_item.getName())&lt;/span&gt;&lt;/a&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;#if ($nav_item.hasChildren())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul class="child-menu"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#foreach ($nav_child in $nav_item.getChildren())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#if ($nav_child.isSelected())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="selected"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#end</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="$nav_child.getURL()" $nav_child.getTarget()&gt;$nav_child.getName()&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;#end<br />&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br />&nbsp;&nbsp;#end<br />&nbsp;&lt;/ul&gt;<br />&lt;/nav&gt;</p>portal_normal.vm:<br />
<p>&lt;!DOCTYPE html&gt;</p>
<p>#parse ($init)</p>
<p>&lt;html class="#language("lang.dir") vp960 vpgt960 vpgt720 vpgt480 vpgt320" dir="#language("lang.dir")" lang="$w3c_language_id"&gt;</p>
<p>&lt;head&gt;<br />&nbsp;&lt;title&gt;$the_title - $company_name&lt;/title&gt;</p>
<p>&nbsp;$theme.include($top_head_include)<br />&lt;/head&gt;</p>
<p>&lt;body class="$css_class"&gt;<br />&nbsp;&lt;div id="dockbar" class="x-6 x-4"&gt;<br />&nbsp;&nbsp;&lt;div id="dockbar-content"&gt; <br />&nbsp;&nbsp;&nbsp;&lt;div class="aui-menu aui-menu-horizontal" id="dockbar-navigation" role="menu"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class="aui-menu-content" role="presentation"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul role="presentation" class="first-of-type"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="aui-menubaritem" role="presentation"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="aui-menuitem-content aui-menu-label aui-helper-unselectable" role="menuitem" id="aui_3_2_0_1179" aria-haspopup="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="icon globe-icon"&gt;Language&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/span&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class="aui-menu aui-submenu aui-menu-hidden" role="menu" aria-labelledby="aui_3_2_0_1177" aria-hidden="true" id="aui_3_2_0_1356"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class="aui-menu-content" role="presentation"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul class="taglib-settings first-of-type" role="presentation"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li role="presentation"&gt;&lt;a lang="zh-CN" href="<a href="http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=zh_CN">http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=zh_CN</a>"&gt; ���� &lt;/a&gt; &lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="selected" role="presentation"&gt; &lt;a lang="en-US" href="<a href="http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=en_US">http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=en_US</a>"&gt; English &lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li role="presentation"&gt; &lt;a lang="de-DE" href="<a href="http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=de_DE">http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=de_DE</a>"&gt; Deutsch &lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li role="presentation"&gt; &lt;a lang="ja-JP" href="<a href="http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=ja_JP">http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=ja_JP</a>"&gt; �ձ��Z &lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li role="presentation"&gt; &lt;a lang="pt-BR" href="<a href="http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=pt_BR">http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=pt_BR</a>"&gt; Portugu��s &lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li role="presentation"&gt; &lt;a lang="es-ES" href="<a href="http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=es_ES">http://www.liferay.com/home?p_p_id=82&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=normal&amp;amp;p_p_mode=view&amp;amp;_82_struts_action=%2Flanguage%2Fview&amp;amp;_82_redirect=%2Fhome&amp;amp;languageId=es_ES</a>"&gt; Espa?ol &lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="aui-menubaritem" role="presentation"&gt; &lt;a class="aui-menuitem-content aui-menu-label" href="<a href="http://www.liferay.com/home?p_auth=hy3laIrR&amp;amp;p_p_id=58&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=maximized&amp;amp;p_p_mode=view&amp;amp;saveLastPath=0&amp;amp;_58_struts_action=%2Flogin%2Fcreate_account">http://www.liferay.com/home?p_auth=hy3laIrR&amp;amp;p_p_id=58&amp;amp;p_p_lifecycle=1&amp;amp;p_p_state=maximized&amp;amp;p_p_mode=view&amp;amp;saveLastPath=0&amp;amp;_58_struts_action=%2Flogin%2Fcreate_account</a>" role="menuitem" id="aui_3_2_0_1184" aria-haspopup="true" tabindex="0"&gt;&lt;span class="link"&gt;Register&lt;/span&gt;&lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="aui-menubaritem" role="presentation"&gt; &lt;a class="aui-menuitem-content aui-menu-label" href="/c/portal/login?p_l_id=8440537" role="menuitem" id="aui_3_2_0_1187" aria-haspopup="true" tabindex="-1"&gt;&lt;span class="link"&gt;Sign In&lt;/span&gt;&lt;/a&gt; &lt;/li&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt; <br />&nbsp;&nbsp;&nbsp;&lt;/div&gt; <br />&nbsp;&nbsp;&lt;/div&gt; <br />&nbsp;&lt;/div&gt;<br />&nbsp;&lt;div class="grid"&gt;<br />&nbsp;&nbsp;&lt;div class="unit u-o"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;div class="unit-content"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;header id="banner" class="doc-header" role="banner"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class="doc-heading cleared" href="/"&gt; &lt;div&gt; &lt;hgroup&gt; &lt;h1&gt; &lt;img height="36" width="146" src="<a href="http://cdn.www.liferay.com/osb-theme/images/custom/heading.png">http://cdn.www.liferay.com/osb-theme/images/custom/heading.png</a>" alt="Liferay"&gt; &lt;/h1&gt; &lt;h2&gt; &lt;img height="36" width="241" src="<a href="http://cdn.www.liferay.com/osb-theme/images/custom/heading-tagline.png">http://cdn.www.liferay.com/osb-theme/images/custom/heading-tagline.png</a>" alt="Open Source, Enterprise, For Life"&gt; &lt;/h2&gt; &lt;/hgroup&gt; &lt;/div&gt; &lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form onsubmit="ctem_3_search(); return false;" name="ctem_3_fm" method="get" class="doc-search" action="<a href="http://www.liferay.com/home?p_p_id=3&amp;amp;p_p_lifecycle=0&amp;amp;p_p_state=maximized&amp;amp;p_p_mode=view&amp;amp;_3_struts_action=%2Fsearch%2Fsearch">http://www.liferay.com/home?p_p_id=3&amp;amp;p_p_lifecycle=0&amp;amp;p_p_state=maximized&amp;amp;p_p_mode=view&amp;amp;_3_struts_action=%2Fsearch%2Fsearch</a>"&gt; &lt;input type="hidden" value="3" name="p_p_id"&gt;&lt;input type="hidden" value="0" name="p_p_lifecycle"&gt;&lt;input type="hidden" value="maximized" name="p_p_state"&gt;&lt;input type="hidden" value="view" name="p_p_mode"&gt;&lt;input type="hidden" value="/search/search" name="_3_struts_action"&gt; &lt;div&gt; &lt;input type="search" autocomplete="off" value="" id="q" name="_3_keywords" class="doc-search-input"&gt; &lt;/div&gt; &lt;/form&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#if ($has_navigation)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#parse ("$full_templates_path/navigation.vm")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#end<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/header&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;#if ($selectable)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$theme.include($content_include)<br />&nbsp;&nbsp;&nbsp;&nbsp;#else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$portletDisplay.recycle()<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$portletDisplay.setTitle($the_title)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$theme.wrapPortlet("portlet.vm", $content_include)<br />&nbsp;&nbsp;&nbsp;&nbsp;#end<br />&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&lt;/div&gt;<br />&lt;/body&gt;</p>
<p>$theme.include($bottom_include)</p>
<p>&lt;/html&gt;</p><br /><br /><img src ="http://www.blogjava.net/zhqh/aggbug/360400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhqh/" target="_blank">zhqh</a> 2011-10-10 16:10 <a href="http://www.blogjava.net/zhqh/articles/liferay.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdk集合类的设计之二</title><link>http://www.blogjava.net/zhqh/articles/222023.html</link><dc:creator>zhqh</dc:creator><author>zhqh</author><pubDate>Thu, 14 Aug 2008 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/zhqh/articles/222023.html</guid><wfw:comment>http://www.blogjava.net/zhqh/comments/222023.html</wfw:comment><comments>http://www.blogjava.net/zhqh/articles/222023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhqh/comments/commentRss/222023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhqh/services/trackbacks/222023.html</trackback:ping><description><![CDATA[jdk集合的基本层次有三层。 <br />
Collection--&gt;List--&gt;ArrayList,比如这样的结构。 <br />
同时伴随着一条抽象类的线。 <br />
AbstractCollection--&gt;AbstractList--&gt;ArrayList,比如这样的线。 <br />
这是因为jdk集合，把list，set都看成是collection。本来，对于list,或者对于set.下面的结构图很好的解决了类层次 <br />
的设计问题。&nbsp;<br />
<wbr><a href="http://sz.photo.store.qq.com/rurl2=bee14b6cd92718d00a8974ab36da2b1c1fcbbd66e3a5f001d3634ccf4ae0f66f557d14a397641bb14c782799183a2d7b831e4702b32df8335ba326202e174d432cffbee612fd4ec54cc3194c9279dfc25a4276b5" target="_blank"></a><wbr><img height="266" alt="" src="http://www.blogjava.net/images/blogjava_net/zhqh/8.jpg" width="320" border="0" />&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图（1） <br />
但是list和set又要提取抽象出去。所以又得把这个结构改装。改装图如下：&nbsp;<br />
<wbr><a href="http://sz.photo.store.qq.com/rurl2=00bb4011f2b19b582c35ca75c9082904d955372b02a02c6802a637e85e37f76d79876a9ffd7f2f5f61e1d2eaf3132911ef39b9352b25e5d072f95348a557e46adf91a447bc88e091ef7525e601818490cac4b857" target="_blank"></a><wbr><img height="296" alt="" src="http://www.blogjava.net/images/blogjava_net/zhqh/9.jpg" width="338" border="0" /> <br />
<br />
这图稍微复杂了一点（而且，他只是类继承体系的一边而已，比如是List那一边）。接口继承接口，抽象类实现接口继承抽象类。仔细看下，其实也很明白。说明： <br />
MyInterface--&gt;MyAbstractClass--&gt;MyConcreteClassB.这是图（1）的一边，当MyConcreteClassB类需要扩展新方法，而不仅仅局限于MyInterface接口定义的方法呢？首先想到的当然是，让MyConcreteClassB同时实现另一个具有新方法的接口。考虑到新接口在集合类中也是一种MyInterface接口，所以，这个新接口继承了MyInterface。同时，对于新接口也需要缺省的或公共的方法，所以，把MyConcreteClassB改装为抽象类，最后，让最终的具体去继承该抽象类以及实现新接口。变成了上面的图。当然，这只是一个基本图。如果，你不一样的需求，完全可以改装你想要的结构。但是，这样的结构，相信维护起来很好。 <br />
然而还是有点疑问？比如说LinkList,当我这样编码时，addFirst方法被过滤了。也就是LinkList无法抽象。因为这个是List接口之外LinkedList自己扩展的方法。 <br />
List linkList = new LinkedList(); <br />
&nbsp;&nbsp;linkList.addFirst("abc");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //error <br />
&nbsp;&nbsp;linkList.add("bcd"); <br />
<br />
LinkedList linkList = new LinkedList(); <br />
&nbsp;&nbsp;linkList.addFirst("abc");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //OK<br />
&nbsp;&nbsp;linkList.add("bcd"); <br />
又比如，在Stack设计上，Stack是继承于Vector的方式来实现，这样就拥有了Vector的所有方法，而这些方法在Stack是不该有的。让人有摸不着头脑的感觉。感觉用委托会好点吧。thinking java 里提到了关于这一点。是建议用LinkedList 委托来实现的。建议大家不要用java.uti.Stack类。而自己通过LinkedList 去构造一个Stack. 
<img src ="http://www.blogjava.net/zhqh/aggbug/222023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhqh/" target="_blank">zhqh</a> 2008-08-14 15:36 <a href="http://www.blogjava.net/zhqh/articles/222023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdk集合类的设计之一</title><link>http://www.blogjava.net/zhqh/articles/222021.html</link><dc:creator>zhqh</dc:creator><author>zhqh</author><pubDate>Thu, 14 Aug 2008 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/zhqh/articles/222021.html</guid><wfw:comment>http://www.blogjava.net/zhqh/comments/222021.html</wfw:comment><comments>http://www.blogjava.net/zhqh/articles/222021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhqh/comments/commentRss/222021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhqh/services/trackbacks/222021.html</trackback:ping><description><![CDATA[&nbsp;
<div class="lh3" id="veryContent" style="overflow: hidden; width: 100%">
<table class="contentTable" id="blogContentTable" cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" valign="top">
            <div id="blogContainer" style="font-size: 12px"><img id="paperPicArea0" style="display: none" alt="" src="http://imgcache.qq.com/ac/b.gif" />&nbsp;<img height="475" alt="" src="http://www.blogjava.net/images/blogjava_net/zhqh/5.jpg" width="670" border="0" /><a href="http://sz.photo.store.qq.com/rurl2=275b1ce2555527eba748085d10d4a40f5464757a28ced13921590c98ae367255704ff37e288183cec32e29ac00c3ba492c9ebf7de405038fb518a537264fdb4af345253bce9a13f75c2a8f461fe62cf386401b1e" target="_blank"></a><wbr>&nbsp;<br />
            喜欢这样的网吗？虽然，东西比较多，但是，还是蛮清晰的。无论你喜欢与否，这确实是个好东西，出自于SUN公司的牛人之作。它是JDK里的集合部分。当然，这样的东西，只能算是utilClass,如果你不想用，完全可以自己造几个轮子，反正，我是不会去造的，除非满足不了需求。 <br />
            这个类层次基本是基于接口的。从顶层到下层，上层都是以抽象呈现的。然后，下层是具体的实现类。这没啥好说的，但是，关键是，如果让你设计这个的一个集合类层次。你会怎么设计呢？当然，跑得起来的代码也叫设计，这里就存在好的设计与糟糕的设计之分了。所以，设计时要考虑很多因素，比如可扩展性啦，可维护性啦，面向抽象编程啦，SRP，OCP等几个面向对象设计原则啦，反正就是很多，大大小小的综合因素权衡出一个设计结果。还有，千万不要小看对于这样的类层次的深刻理解，它对于你的面向对象思想有着极大的帮助。某某天，你参与了一个项目，首先得会做设计哦，并且，得设计好，不然，架构师就空有其名了。 当我在思考这个主题时，我产生了不少想法。有些可能是不成熟的。还是列出来下。 <br />
            1.&nbsp;&nbsp;自上而下设计 <br />
            2.&nbsp;&nbsp;自下而上设计 <br />
            3.&nbsp;&nbsp;基于接口的多个行为有异的类继承设计 <br />
            1 . 自上而下设计 <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 概念很明确，就是从接口抽象类开始。但是，你必须对于几个具体实现的抽象部分有着清晰的认识。并且你大致了解了这些具体实现类的规模以及职责所在，否则就变成了异形。然而，设计本身是个跌代的过程，所以，这是个不错的选择方案。 <br />
            2。自下而上设计 <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 你不了解具体实现类的规模以及职责所在，你只是随意或者仅仅针对于某一需求，写了一个辅助类。当然，你知道这个类是个有状态类，同时，它似乎在某个时刻跟别人有着某某关系（不知道是继承还是委托），所以，你没把这个类设计成为abstract, final, private constrcutor,OK，你只是保留着这种变化。然后，你又写了一个类，然后，发现这两个类有着共同的部分。然后，又写了一个，发现了不少新的东西。恩，很好，需要动作了，你开始思考怎么用设计模式把这些共同部分（可能在不同类有不同的实现）组织起来。对于，抽象方法，template模式能帮你解决大部分问题。同时，你需要到委托，所以，你还得考虑怎么使用委托才能得到良好的设计----可参考设计模式之进化论。 <br />
            3。基于接口的多个行为有异的类继承设计 <br />
            &nbsp;&nbsp; 无论采用哪一种方式做设计。都能得到最终的好结果。而结果也基本是一致的。 <br />
            &nbsp;&nbsp; 下面是个例子。 <br />
            &nbsp;&nbsp; 你写了一个接口,并且提供了两实现类。 <br />
            &nbsp;&nbsp; interface MyInterface{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void println(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void print(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public int size(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty(); <br />
            &nbsp;&nbsp; } <br />
            &nbsp;&nbsp;class MyConcreteClassA implements MyInterface{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return size() == 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void print() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("A"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void println() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("A"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public int size() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
            <br />
            &nbsp;&nbsp; } <br />
            &nbsp;&nbsp; class MyConcreteClassB implements MyInterface{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return size() == 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("B"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("B"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int size() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            然而，你又发现这两个实现类中有着共同的东西--isEmpty方法。所以，你得提取出来，顶层是个接口，没法放实现体。放哪里呢？有一个好的办法，就是把接口改成抽象类。记住，接口的条件比抽象类更强。改造如下： <br />
            <wbr><a href="http://sz.photo.store.qq.com/rurl2=95f56487790dc9cf4e049e84daed9c231581e1903a4cd5e62e584de0d0dd437ba59b79a4ca666a1a6546de6c2fb395d1bfa954bb9a9fb16b3ef0ba710f1265438165ae4762972314ea4856b76036d96218ca0be1" target="_blank"></a><wbr><img height="170" alt="" src="http://www.blogjava.net/images/blogjava_net/zhqh/6.jpg" width="236" border="0" /><br />
            <br />
            abstract class MyAbstractClass{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public abstract void println(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public abstract void print(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public abstract int size(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty(){ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return size() == 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            } <br />
            class MyConcreteClassA extends MyAbstractClass{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void print() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("A"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void println() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("A"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public int size() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            } <br />
            class MyConcreteClassB extends MyAbstractClass{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void print() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("B"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void println() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("B"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public int size() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            } <br />
            这个template模式帮你解决了问题。同时，你也能保持住基于抽象编程这个好东西。 <br />
            那么，还有一种方案，也就是JDK设计所使用的。 <br />
            <wbr><a href="http://sz.photo.store.qq.com/rurl2=bee14b6cd92718d00a8974ab36da2b1c5d33692ebf6ef7acf2ff9a293b0a39744c02a7cd1c84d9a99822197092ac5c2c72e5ef6e7399c2ec3daa31e48f12b7c8c55966757053e229363d29f725a855744a9d5da9" target="_blank"></a><wbr><img height="266" alt="" src="http://www.blogjava.net/images/blogjava_net/zhqh/7.jpg" width="320" border="0" /><br />
            interface MyInterface{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void println(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void print(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public int size(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty(); <br />
            } <br />
            abstract class MyAbstractClass implements MyInterface{ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public abstract void println(); --------（1） <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public abstract void print();&nbsp;&nbsp;&nbsp;&nbsp;--------（2） <br />
            &nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public abstract int size(); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public boolean isEmpty(){ <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return size() == 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            } <br />
            class MyConcreteClassA extends MyAbstractClass implements MyInterface{&nbsp;&nbsp;--------（3） <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void print() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("A"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void println() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("A"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public int size() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            } <br />
            class MyConcreteClassB extends MyAbstractClass implements MyInterface{&nbsp;&nbsp; --------（4） <br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void print() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("B"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public void println() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("B"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            &nbsp;&nbsp;&nbsp;&nbsp;public int size() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;} <br />
            } <br />
            说明：抽象类MyAbstractClass 的抽象方法（1）和（2）可以不必显式写出来。因为抽象类会继承接口的抽象方法。同时，类MyConcreteClassA 定义中（3）的implements MyInterface{ 也可以不显式写出。尽管多了一个中间抽象类MyAbstractClass 层（有些公共方法或者缺省方法已在此实现），但是还是必须实现MyInterface中剩下的所有接口方法。 <br />
            这样的结果，很好。所有具体类的公共方法被抽象基类实现了，同时，具体类也可以覆盖基类的缺省方法。对于子类是否支持某一个接口方法的解决，在抽象基类中实现一个缺省的方法更是有效。否则，就算是某一子类不支持该方法，也必须被实现。比如，你throw了一个 UnsupportedOperationException异常。这样很不好。</div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/zhqh/aggbug/222021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhqh/" target="_blank">zhqh</a> 2008-08-14 15:34 <a href="http://www.blogjava.net/zhqh/articles/222021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>