﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-沧海一粟</title><link>http://www.blogjava.net/menlong999/</link><description>生活简单，喜欢自由自在，喜欢很多东西，偶尔做事会出格，有很多希望，有很多梦想......</description><language>zh-cn</language><lastBuildDate>Sun, 10 May 2026 13:41:52 GMT</lastBuildDate><pubDate>Sun, 10 May 2026 13:41:52 GMT</pubDate><ttl>60</ttl><item><title>不再更新，请移步 http://adrop.me/</title><link>http://www.blogjava.net/menlong999/archive/2012/10/18/389853.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Thu, 18 Oct 2012 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2012/10/18/389853.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/389853.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2012/10/18/389853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/389853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/389853.html</trackback:ping><description><![CDATA[<a href="http://adrop.me/">http://adrop.me/</a>&nbsp;<br /> <div id="GOOGLE_INPUT_CHEXT_IFRAME_FLAG" style="display: none; "></div><img src ="http://www.blogjava.net/menlong999/aggbug/389853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2012-10-18 23:48 <a href="http://www.blogjava.net/menlong999/archive/2012/10/18/389853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bayeux协议</title><link>http://www.blogjava.net/menlong999/archive/2009/08/16/291365.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Sun, 16 Aug 2009 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2009/08/16/291365.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/291365.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2009/08/16/291365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/291365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/291365.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Bayeux协议（Bayeux真的不知道怎么翻。。。）Bayeux 协议-- Bayeux 1.0草案1本备忘录状态This document specifies a protocol for the Internet community, and requestsdiscussion and suggestions for improvement. This memo is written ...&nbsp;&nbsp;<a href='http://www.blogjava.net/menlong999/archive/2009/08/16/291365.html'>阅读全文</a><img src ="http://www.blogjava.net/menlong999/aggbug/291365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2009-08-16 17:42 <a href="http://www.blogjava.net/menlong999/archive/2009/08/16/291365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作笔记分享</title><link>http://www.blogjava.net/menlong999/archive/2008/10/02/232121.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Thu, 02 Oct 2008 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/10/02/232121.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/232121.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/10/02/232121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/232121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/232121.html</trackback:ping><description><![CDATA[<h1 style="text-align: center;">  工作笔记分享</h1>国庆假期中，粗略看了下Unix网络编程卷一：套接字API。进一步加深了对Linux、Unix下的socket处理。重点是非阻塞、select多路复用等。记录笔记几篇。其他笔记为日常摘录等。<br>用Google Notebook记录，特发布和大家分享：<br>学习笔记：<br><a title="http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQtMHZkLoh?hl=zh-CN" href="http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQtMHZkLoh?hl=zh-CN" id="jxz.">http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQtMHZkLoh?hl=zh-CN</a> <br>日常笔记：<br><a title="http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQlOD34rMh?hl=zh-CN" href="http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQlOD34rMh?hl=zh-CN" id="xwe2">http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQlOD34rMh?hl=zh-CN</a> <br><br><br><br><img src ="http://www.blogjava.net/menlong999/aggbug/232121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-10-02 20:24 <a href="http://www.blogjava.net/menlong999/archive/2008/10/02/232121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java、Linux、C++电子书分享</title><link>http://www.blogjava.net/menlong999/archive/2008/09/28/231737.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Sun, 28 Sep 2008 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/28/231737.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/231737.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/28/231737.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/231737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/231737.html</trackback:ping><description><![CDATA[<h1 style="text-align: center;"><strong>  Java、Linux、C++电子书分享</strong></h1>
<br />
收藏的一些电子书，跟大家分享下。部分java书有下载链接，其他的都是抓图，都放在<a title="Dropbox" href="https://www.getdropbox.com" id="b25h">Dropbox</a> （文件在线存储、同步、共享服务，2G免费空间，有windows、linux客户端，本地文件和服务器共享可以同步）的共享上。需要的可以到Dropbox首页注册，告诉我你的帐号后，我可以把共享开放给你。我的帐号：menlong999@gmail.com<br />
Dropbox很不错，客户端速度很快，还有版本控制，强烈推荐！<br />
<h1><strong>Java</strong></h1>
Java与模式： 阎宏的Java设计模式，讲的很好<br />
JSP2.0技术手册（部分）<br />
thinking in java 中文版第三版（全）：不用多介绍了<br />
<a title="j-nio.zip" href="http://dl.getdropbox.com/u/162923/Books/Java/j-nio.zip" id="unl1">j-nio.zip</a> ：IBM developerWorks上java.nio教程，很不错，带源码<br />
<a title="JUnit.in.Action中文版.pdf" href="http://dl.getdropbox.com/u/162923/Books/Java/JUnit.in.Action%E4%B8%AD%E6%96%87%E7%89%88.pdf" id="tggk">JUnit.in.Action中文版.pdf</a> <br />
<a title="OReilly.Java.I.O.2nd.Edition.May.2006.chm" href="http://dl.getdropbox.com/u/162923/Books/Java/OReilly.Java.I.O.2nd.Edition.May.2006.chm" id="y4h9">OReilly.Java.I.O.2nd.Edition.May.2006.chm</a> <br />
<a title="OReilly.Java.Network.Programming.Third.Edition.Oct.2004.chm" href="http://dl.getdropbox.com/u/162923/Books/Java/OReilly.Java.Network.Programming.Third.Edition.Oct.2004.chm" id="hn2:">OReilly.Java.Network.Programming.Third.Edition.Oct.2004.chm</a> <br />
<a title="starting-struts2-chinese.pdf：中文的InfoQ Struts2迷你书" href="http://dl.getdropbox.com/u/162923/Books/Java/starting-struts2-chinese.pdf" id="owk7">starting-struts2-chinese.pdf：中文的InfoQ Struts2迷你书</a> <br />
<a title="Java NIO-Developing High Performance Applications.pdf" href="http://dl.getdropbox.com/u/162923/Books/Java/Java%20NIO-Developing%20High%20Performance%20Applications.pdf" id="vm1j">Java NIO-Developing High Performance Applications.pdf</a> <br />
<a title="Struts 2 in Action.pdf" href="http://dl.getdropbox.com/u/162923/Books/Java/Struts%202%20in%20Action.pdf" id="mn6u">Struts 2 in Action.pdf</a> <br />
<a title="UML for Java Programmers中文版.pdf" href="http://dl.getdropbox.com/u/162923/Books/Java/UML%20for%20Java%20Programmers%E4%B8%AD%E6%96%87%E7%89%88.pdf" id="gsm5">UML for Java Programmers中文版.pdf</a> <br />
<a title="实用J2EE设计模式编程指南.pdf" href="http://dl.getdropbox.com/u/162923/Books/Java/%E5%AE%9E%E7%94%A8J2EE%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%BC%96%E7%A8%8B%E6%8C%87%E5%8D%97.pdf" id="c0wl">实用J2EE设计模式编程指南.pdf</a> ：比较老的，不过也不错，怀旧一把<br />
<br />
<h1>Linux</h1>
<div id="flkg" style="padding: 1em 0pt; text-align: left;"><img style="width: 250px; height: 172px;" src="http://docs.google.com/File?id=ah897shxqwtx_176g25fh75c_b"  alt="" /></div>
<h1>C++</h1>
<div id="ht2w" style="padding: 1em 0pt; text-align: left;"><img style="width: 251px; height: 139px;" src="http://docs.google.com/File?id=ah897shxqwtx_177xtrzzndj_b"  alt="" /></div>
<h1>其他</h1>
<div id="woag" style="padding: 1em 0pt; text-align: left;"><img style="width: 265px; height: 121px;" src="http://docs.google.com/File?id=ah897shxqwtx_178gswgxvhm_b"  alt="" /></div>
<br />
<div id="qom-" style="padding: 1em 0pt; text-align: left;"><br />
</div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/menlong999/aggbug/231737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-28 21:21 <a href="http://www.blogjava.net/menlong999/archive/2008/09/28/231737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet与模板方法模式</title><link>http://www.blogjava.net/menlong999/archive/2008/09/17/229332.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Wed, 17 Sep 2008 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/17/229332.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/229332.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/17/229332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/229332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/229332.html</trackback:ping><description><![CDATA[<h1 style="text-align: center;">Servlet与模板方法模式</h1>
<h2 style="text-align: right;">----Head First Pattern之模板方法模式</h2>
<br />
这
年头大家都用struts，或者其他MVC框架，很少有人直接用Servlet了吧，但是相信大部分人都应该知道怎么写Servlet的吧，继承
HttpServlet类，覆盖里面的doGet、doPost方法即可，大部分情况下，我们都是对GET和POST一样处理，一般也就这么写了：<br />
public MyServlet extends HttpServlet{<br />
&nbsp;&nbsp;&nbsp; public void doGet(HttpServletRequest request, HttpServletResponse response){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; // 处理<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;&nbsp; public void doPost()HttpServletRequest request, HttpServletResponse response){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; // 不关心get、post请求，因此post处理直接调用get处理<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; doGet(request, response);<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
Servlet只要在web.xml中部署好之后，就可以处理浏览器的请求了。上面代码可以看出来，doGet方法处理浏览器的GET请求，doPost处理POST请求。<br />
Servlet是由Tomcat之类的servlet容器来调用处理浏览器请求的，并需要集成基类HttpServlet，如果大家查看HttpServlet源码的时候，就会发现，其实里面有一个<br />
<strong><font color="#0000ff">protected</font></strong> <strong><font color="#0000ff">void</font></strong> service(<a href="http://www.chinaitpower.com/source/j2ee1.3.1/javax/servlet/http/HttpServletRequest.java.html"><font color="#ff0000"><u>HttpServletRequest</u></font></a> req, <a href="http://www.chinaitpower.com/source/j2ee1.3.1/javax/servlet/http/HttpServletResponse.java.html"><font color="#ff0000"><u>HttpServletResponse</u></font></a> resp)<br />
方法，servlet容器实际调用的是service方法，service方法的实现就是根据HTTP请求的类型（GET、POST，还是其他），将处理委派给doGet、doPost等方法，由这些子类的方法来最终处理浏览器的请求。<br />
<br />
由此可以看出，HttpServlet定义了一个处理的框架或者说模板，实现Servlet只需继承HttpServlet并实现doGet、doPost等方法即可。<br />
<br />
是引出模板方法模式定义的时候了，<strong>模板方法模式：在一个方法中定义一个算法的骨架，将某些步骤推迟到子类中实现。模板方法允许子类重新定义算法的某些步骤，而不改变算法的结构。</strong><br />
简单UML类图如下：<br />
<div id="cko6" style="padding: 1em 0pt; text-align: left;"><img style="width: 140px; height: 122px;" src="http://docs.google.com/a/acubalance.ca/File?id=ah897shxqwtx_173gbvrx5cw_b"  alt="" /></div>
简单实现一个抽象类：<br />
public abstract Template{<br />
&nbsp;&nbsp;&nbsp; public void <strong>final </strong>templateMethod(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; step1();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; step2();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; hook();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public abstract void step1();<br />
&nbsp;&nbsp;&nbsp; public abstract void step2();<br />
&nbsp;&nbsp;&nbsp; <strong>public void hook(){}</strong><br />
}<br />
<br />
这个抽象类，定义了一个算法的骨架，需要step1、step2，都是抽象方法，需要子类来实现。而templateMethod是final的，即不允许子类覆盖。其中定义了方法的步骤，step1、step2。<br />
如下为具体实现：<br />
public ConcreteTemplate extends Template{<br />
&nbsp;&nbsp;&nbsp; public void step1(){System.out.println("step1");}<br />
&nbsp;&nbsp; &nbsp;public void step2(){System.out.println("step2");}<br />
&nbsp;&nbsp;&nbsp; public void hook(){System.out.println("hook");}<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Template temp = new ConcreteTemplate();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; temp.templateMethod();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
可以看到其中加入了一个hook方法，即钩子方法。hook方法在抽象类中的实现为空，是留给子类做一些可选的操作。如果某个子类需要一些特殊额外的操作，则可以实现hook方法，当然也可以完全不用理会，因为hook在抽象类中只是空方法而已。<br />
<br />
其他扩展：<br />
1.可以定义多个hook方法<br />
2.hook方法可以定义一个返回为boolean的方法，有子类来决定是否调用hook方法。<br />
eg：抽象类的templateMethod可以这样实现：<br />
&nbsp;&nbsp; &nbsp;public void <strong>final </strong>templateMethod(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; step1();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; step2();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if(allowHook())<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; hook();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public boolean allowHook(){return true;}<br />
&nbsp;&nbsp;&nbsp; public void hook(){}<br />
子类中可以覆盖allowHook，以决定是否调用hook方法。<br />
3.抽象类定义的步骤，可以有默认实现，而非全是abstract方法。HttpServlet中已经有doGet、doPost等方法的默认实现，大家可以参考其源码实现。<br />
<br />
更好的一个模板方法的例子是Applet，实现自己的Applet，必须继承自Applet，里面实现init、start、stop、destroy等方法即可。这些方法都是有默认实现的，如果看源码，可以发现默认实现其实都是空。<br />
<br />
<strong>了解模板方法模式之后，大家可能意识到Servlet并且完全按照模板方法定义的那样，而是有一些区别，比如提供默认doGet、doPost的实现等。这都说明，在实际编程中，并非生搬硬套设计模式，而是根据实际，会做些变动或变形，但其本质不变。<br />
不能为了模式而模式。那究竟什么时候需要设计模式呢？个人理解，当你发现你的类有问题的时候，比如有重复代码了，感觉有些不对劲了，感觉不适应以后的扩充了，这时候不妨考虑下，是不是该设计模式出场了。。<br />
纯粹个人理解。。有不当之处，请及时拍砖。。</strong><br />
<br />
<img src ="http://www.blogjava.net/menlong999/aggbug/229332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-17 09:40 <a href="http://www.blogjava.net/menlong999/archive/2008/09/17/229332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不能在Google Docs上直接发布到blogjava了？？</title><link>http://www.blogjava.net/menlong999/archive/2008/09/17/229285.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Tue, 16 Sep 2008 16:02:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/17/229285.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/229285.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/17/229285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/229285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/229285.html</trackback:ping><description><![CDATA[我写东西，都是在Google Docs上写，然后用Docs的发布功能，发布到blog上。以前的几篇都可以顺利发布到blogjava上，也没有乱码，以前在csdn上有乱码。今天突然不能发布了，也没有任何错误提示。是Google Docs的问题，还是blogjava的问题？<br />
有人像我这样用docs写，然后发布blog吗？<br />
<br />
<img src ="http://www.blogjava.net/menlong999/aggbug/229285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-17 00:02 <a href="http://www.blogjava.net/menlong999/archive/2008/09/17/229285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>移动硬盘与适配器模式</title><link>http://www.blogjava.net/menlong999/archive/2008/09/15/229011.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Mon, 15 Sep 2008 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/15/229011.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/229011.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/15/229011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/229011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/229011.html</trackback:ping><description><![CDATA[
<P ALIGN=CENTER STYLE="margin-top: 0.17in; margin-bottom: 0.04in"><FONT FACE="宋体, SimSun"><FONT SIZE=4><B>移动硬盘与适配器模式</B></FONT></FONT></P>
<P ALIGN=RIGHT STYLE="margin-top: 0.17in; margin-bottom: 0.04in; line-height: 130%">
<FONT FACE="Cambria, serif"><FONT SIZE=4><B>----Head
First Pattern</B></FONT></FONT><FONT FACE="宋体, SimSun"><FONT SIZE=4><B>之适配器模式</B></FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">很多人都有移动硬盘，它比</FONT>U<FONT FACE="宋体, SimSun">盘容量大的多，体积也小，携带方便，用来拷资料、备份都很不错。并且硬盘价格越来越便宜，</FONT>120G<FONT FACE="宋体, SimSun">的移动硬盘现在才</FONT>300<FONT FACE="宋体, SimSun">多。</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">其实移动硬盘里面就是一块普通的笔记本硬盘，还有一个</FONT>IDE<FONT FACE="宋体, SimSun">口（或</FONT>SATA<FONT FACE="宋体, SimSun">口，看硬盘的类型了，现在一般都是</FONT>SATA<FONT FACE="宋体, SimSun">口即串口，</FONT>IDE<FONT FACE="宋体, SimSun">口就是并口）和</FONT>USB<FONT FACE="宋体, SimSun">口的转换卡，用</FONT>USB<FONT FACE="宋体, SimSun">线和电脑上的</FONT>USB<FONT FACE="宋体, SimSun">口连接起来就行了。</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">我手头有一个</FONT>40G<FONT FACE="宋体, SimSun">的</FONT>IDE<FONT FACE="宋体, SimSun">口笔记本硬盘，想在</FONT>PC<FONT FACE="宋体, SimSun">电脑上用，但又不想把电脑拆开插主板的</FONT>IDE<FONT FACE="宋体, SimSun">线上。看到电脑上还有很多空闲的</FONT>USB<FONT FACE="宋体, SimSun">口，就想能不能让笔记本硬盘的</FONT>IDE<FONT FACE="宋体, SimSun">口连到电脑的</FONT>USB<FONT FACE="宋体, SimSun">口？直接连肯定不行，接口不匹配啊。就去电子市场逛了一个下午，发现有一种转接卡，一头可以插</FONT>IDE<FONT FACE="宋体, SimSun">口，一头是</FONT>USB<FONT FACE="宋体, SimSun">口，能连</FONT>USB<FONT FACE="宋体, SimSun">线，</FONT>USB<FONT FACE="宋体, SimSun">线就可以连电脑的</FONT>USB<FONT FACE="宋体, SimSun">口了。我买了转接卡回到家，把转接卡一头插在笔记本硬盘的</FONT>IDE<FONT FACE="宋体, SimSun">口上，另一头连上</FONT>USB<FONT FACE="宋体, SimSun">线，再把</FONT>USB<FONT FACE="宋体, SimSun">线连到电脑的</FONT>USB<FONT FACE="宋体, SimSun">口上。大功告成，现在我的笔记本硬盘就变成移动硬盘了。转接卡就是连接</FONT>IDE<FONT FACE="宋体, SimSun">口和</FONT>USB<FONT FACE="宋体, SimSun">口的适配器。这就是适配器模式。</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">下面看适配器的</FONT>UML<FONT FACE="宋体, SimSun">类图：</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><IMG src="http://docs.google.com/File?id=ah897shxqwtx_171hqrbh8fv_b" NAME="graphics1" ALIGN=BOTTOM WIDTH=359 HEIGHT=147 BORDER=0></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">这个类图有点问题，其实</FONT>Adaptee<FONT FACE="宋体, SimSun">应该是一个接口，还有个实现这个接口的</FONT>ConcreteAdaptee<FONT FACE="宋体, SimSun">，而</FONT>Adapter<FONT FACE="宋体, SimSun">是目标接口，</FONT>ConcreteAdapter<FONT FACE="宋体, SimSun">必须实现</FONT>Adapter<FONT FACE="宋体, SimSun">，持有一个</FONT>Adaptee<FONT FACE="宋体, SimSun">。移动硬盘和适配器模式对应关系如下：</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in">Adapter<FONT FACE="宋体, SimSun">：
</FONT>USB<FONT FACE="宋体, SimSun">接口</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in">Adaptee<FONT FACE="宋体, SimSun">：笔记本硬盘的</FONT>IDE<FONT FACE="宋体, SimSun">接口</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in">ConcreteAdapter<FONT FACE="宋体, SimSun">：转接卡</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">总而言之，适配器模式就是把一个接口</FONT>Adaptee<FONT FACE="宋体, SimSun">，适配成目标接口</FONT>Adapter<FONT FACE="宋体, SimSun">。</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="宋体, SimSun">某些时候适配器和装饰模式有点相同之处，但是两者本质是不一样的。</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0in">Adapter<FONT FACE="宋体, SimSun">是把所包装的接口，转换为另一个接口。而</FONT>Decorator<FONT FACE="宋体, SimSun">是给所包装的接口，添加新的行为或方法。</FONT></P>
<br><img src ="http://www.blogjava.net/menlong999/aggbug/229011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-15 17:53 <a href="http://www.blogjava.net/menlong999/archive/2008/09/15/229011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Head First Pattern之单例模式</title><link>http://www.blogjava.net/menlong999/archive/2008/09/14/228893.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Sun, 14 Sep 2008 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/14/228893.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/228893.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/14/228893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/228893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/228893.html</trackback:ping><description><![CDATA[<h1>多线程环境下的单例模式实现</h1><h2 style="text-align: right;">----Head First Pattern之单例模式</h2><br><div><br>单例模式我想大家都比较熟悉，就是在JVM运行期间一个类只有一个实例，任何时候都是取得同一个实例，也就是一个全局变量了。<br>单例模式分懒汉式和饿汉式，但是懒汉式的单例在多线程环境下会有同步的问题，下面详细介绍了用3中方法来解决此问题。<br>单例模式具有以下几个特点：<br>1.JVM运行期间有且只有一个实例<br>2.构造函数是私有的<br>3.通过一个静态工厂方法来获得唯一的实例<br>4.累内部有一个私有静态实例，通过静态工厂方法创建后，每次再调用静态工厂方法，返回的都是同一个实例<br><br>饿汉式：<br>public class Singleton{<br>    private static Singleton uniqueInstance = new Singleton();<br>    // 其他实例变量<br>    private Singleton(){}<br>    public static Singleton getInstance(){<br>        return uniqueInstance;<br>    }<br>    <br>    // 其他方法<br>}<br><br>懒汉式：<br>public class Singleton{<br>
    private static Singleton uniqueInstance;<br>
    // 其他实例变量<br>
    private Singleton(){}<br>
    public static Singleton getInstance(){<br>
        if(uniqueInstance == null){<br>
            uniqueInstance = new Signleton();<br>
        }<br>
        return uniqueInstance;<br>
    }<br>
    <br>
    // 其他方法<br>
}<br><br>多线程环境下的单例模式：<br>上面的代码就是最基本的单例模式示例代码。但是懒汉式单例有一个问题，因为要保证有且仅有一个实例，如果在多线程环境下调用Singleton.getInstance()，就可能会有多个实例！为了解决多线程访问的问题，有3种解决方法供选择：<br><br><b>1.静态工厂方法加同步关键字，这种方法是在对性能要求不高的情况下采用。</b><br>public class Singleton{<br>

    private static Singleton uniqueInstance;<br>

    // 其他实例变量<br>

    private Singleton(){}<br>

    public static <b style="color: rgb(255, 0, 0);">synchronised</b> Singleton getInstance(){<br>

        if(uniqueInstance == null){<br>

            uniqueInstance = new Signleton();<br>

        }<br>

        return uniqueInstance;<br>

    }<br>

    <br>

    // 其他方法<br>

}<br><br><b>2.始终用饿汉式单例</b><br>public class Singleton{<br>
    private static Singleton uniqueInstance = new Singleton();<br>
    // 其他实例变量<br>
    private Singleton(){}<br>
    public static Singleton getInstance(){<br>
        return uniqueInstance;<br>
    }<br>
    <br>
    // 其他方法<br>
}<br>饿汉式的方法，会依赖于JVM在加载类的时候，就创建唯一的实例。在每个线程访问getInstance方法前，唯一实例已经被创建。<br><br><b>3.用双检查锁来减少懒汉式中静态方法getInstance的同步开销</b><br>对public static synchronised Singleton getInstance()的每次调用，都需要同步，而双检查锁的方式只是在第一次创建实例时同步，其他时候并不需要同步。<br>public class Singleton{<br>    private <b>volatile </b>static Singleton uniqueInstance;<br>    private Singleton(){}<br>    public static Singleton getInstance(){<br>        if(uniqueInstance == null){<br>            <b>synchronised(Singleton.class){<br>                if(uniqueInstance == null){<br>                       uniqueInstance = new Singleton();<br>                }<br>            }</b><br>        }<br>        return uniqueInstance;<br>    }<br>}<br><br>如果调用时实例为null，则进入同步区块，此时再进行判断，如果还为null，就创建唯一的实例。有可能在一个线程在 if(uniqueInstance == null) 后进入同步区块前，另一个线程恰好已经创建成功并从同步区块中出来，这就需要进入同步区块后，再做uniqueInstance是否为null的判断。<br>同时uniqueInstance需要加volatile关键字，保证在创建单例实例时，多个线程能正确处理uniqueInstance变量。<br><br><b>注意：</b><br>双检查锁的方式在Java1.4及1.4以前版本不能工作！！因此双检查锁只能在Java 5及以上版本才可以使用。<br>记得Effictive Java中也提到过双检查锁，也说不能在Java1.4中使用。<br>原因是Java 1.4及以前的JVM中对volatile关键字的实现允许对双检查锁不合适的同步。（谁能帮我再深入解释下？）原文是：<br>Unfortunately, in Java version 1.4 and earlier, many JVMs contain implementations of the volatile keyword that allow improper synchronization for double-checked locking. If you must use a JVM other than Java 5, consider other methods of implementing your Singleton.<br><br></div><br><img src ="http://www.blogjava.net/menlong999/aggbug/228893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-14 15:40 <a href="http://www.blogjava.net/menlong999/archive/2008/09/14/228893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新博开张</title><link>http://www.blogjava.net/menlong999/archive/2008/09/14/228816.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Sat, 13 Sep 2008 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/14/228816.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/228816.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/14/228816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/228816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/228816.html</trackback:ping><description><![CDATA[ 

    
    
    
<h1>新博开张</h1><br>最早用的是blogger，不过一直被封。。偶尔解封几天又被封。现在托奥运的福，已经解了。但愿以后不要再被封。可恶的GFW。。。。<br><br>后来用csdn，人够多，但是也够烂。一直也没坚持写多少东西，都是决心下了，就是懒的动手写，并且发现写东西的时候，老是前言不对后尾，前面说什么还没说完，后来就开始跑题，还有，写作水平好像越来越差，总感觉一句话写的不明不白，甚至还有点啰嗦。<br><br>始终觉得cnblog还行，界面够简单，也够丑的了。。几乎都是技术的。平时也有订阅。今天终于搬来，竟然还需要人工审核，没想到。<br><br>不过写博，毕竟是为了让人看，如果有很多评论，或者很多人订阅rss，肯定非常非常有成就感！！<br>被人捧也好，被人骂也好，被人褒扬也好，被人拍砖也好，只要有人来看，就是好！！<br><br>以后有空还是多写写的好。<br><img src ="http://www.blogjava.net/menlong999/aggbug/228816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-14 00:06 <a href="http://www.blogjava.net/menlong999/archive/2008/09/14/228816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Head First Pattern之代理模式</title><link>http://www.blogjava.net/menlong999/archive/2008/09/13/228810.html</link><dc:creator>Lv Yuanfang</dc:creator><author>Lv Yuanfang</author><pubDate>Sat, 13 Sep 2008 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/menlong999/archive/2008/09/13/228810.html</guid><wfw:comment>http://www.blogjava.net/menlong999/comments/228810.html</wfw:comment><comments>http://www.blogjava.net/menlong999/archive/2008/09/13/228810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/menlong999/comments/commentRss/228810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/menlong999/services/trackbacks/228810.html</trackback:ping><description><![CDATA[<h1><a name="Head_First_Pattern_93247998226_08606009744107723" id="Head_First_Pattern_93247998226_08606009744107723"></a>Head First Pattern之代理模式<br></h1><div class="writely-toc" id="WritelyTableOfContents" toctype="decimal+disc"><ol class="writely-toc-decimal"><li><a target="_self" href="#Head_First_Pattern_93247998226_08606009744107723">Head First Pattern之代理模式</a><ol style="margin-left:0" class="writely-toc-subheading writely-toc-disc"><li><a target="_self" href="#_40936482697725296_39685097988">远程代理</a></li><li><a target="_self" href="#_3253479525446892_565335180610_5202975915744901">虚拟代理</a></li><li><a target="_self" href="#JDK_23414514306932688_91246650_5588917890563607">JDK动态代理</a></li><li><a target="_self" href="#_Decorator_">和Decorator的比较</a></li></ol></li></ol></div><div><br></div><div>去年买的Head First Pattern英文版，看了一点点，看起来还是比较吃力。。今年开始一点点的看，慢慢的看进去了，真是好书啊，一点点的从实际例子入手，一步步的、循序渐进的说明每一个设计模式，真是足够的深入浅出！以前也看过阎宏的《Java与模式》，结合中国的传统道家文化、儒家思想，甚至西游记、红楼梦、女娲造人都用上了，说的是也算够透彻了的，但是总感觉还是有些东西理解的不太深。</div><div>下面总结下这些天看的代理模式。。<br></div><div><br></div><div>一句话概括代理模式，就是用代理对象对真实对象的访问控制，代理对象和真实对象都实现同一个Subject接口。</div><div>类图表示如下：</div><div><div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="dtbd"><img src="http://docs.google.com/File?id=ah897shxqwtx_164ftv8svc2_b" style="width: 391px; height: 150px"></div><div style="text-align: left; padding-top: 1em; padding-bottom: 1em; padding-right: 0px; padding-left: 0px" id="dtbd">图截自http://refcardz.dzone.com/里的免费书：<a href="http://refcardz.dzone.com/refcardz/design-patterns?oid=hom3091"><b>Design Patterns</b></a></div></div><div>个人理解，代理模式在现实例子里，可以有非常多的变种，关键在于代理对象如何实现对真实对象的访问控制。变化在于访问控制的方式。着重说明下书中的3个例子，就是3种代理模式的使用场合。。</div><div><br><h2><a name="_40936482697725296_39685097988" id="_40936482697725296_39685097988"></a>远程代理<br></h2><div>远程代理的例子是java中的RMI。真是足够深入浅出的，让我以前对RMI非常模糊的印象也渐渐清晰起来。咱们一步步细细道来。。</div><div><br></div><div>第一步：定义远程接口</div><div><br></div><div>1.继承java.rmi.Remote接口</div><div>定义服务接口，服务接口必须继承自Remote接口。Remote接口是一个标记接口，就是这个接口，没有任何要实现的方法，仅仅是用来标识其实现类具有某种功能（个人理解），就像Serializable接口，仅仅表示实现这个接口的类能被序列化。</div><div>public interface MyRemote extends Remote {</div><div><br></div><div>2.服务接口中所有方法抛出RemoteException异常</div><div>RMI客户端的方法调用其实是调用实现Remote接口的Stub（桩），桩的实现是基于网络和IO的（底层就是socket），客户端在调用方法过程中，任何错误都有可能发生，所以必须让客户端知道所发生的异常，并能捕捉。</div><div>import java.rmi.*;</div><div>public interface MyRemote extends Remote {</div><div>    public String sayHello() throws RemoteException;<br></div><div>}</div><div><br></div><div>3.保证返回值和参数必须是可序列化的</div><div>远程方法的参数要通过网络传输，因此必须是可序列化的，返回值也是同样。如果用原生类型（int、float等）、String、集合等，就没问题，如果用自己的类型，必须实现Serializable接口（和Remote接口一样，都是标记接口）。</div><div><br></div><div>第二步：实现远程服务</div><div><br></div><div>1.实现远程接口</div><div>public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{</div><div>    public String sayHello(){<br></div><div>        return "Hello, I'm server.";<br></div><div>    }</div><div>}</div><div><br></div><div>2.继承UnicastRemoteObject </div><div>要想成为一个远程服务对象，需要有远程的功能。最简单的方法就是实现UnicastRemoteObject方法了。</div><div><br></div><div>3.声明一个无参数的构造函数，且抛出RemoteException</div><div>public MyRemoteImpl() throws RemoteException{}</div><div><br></div><div>4.用RMI registry注册服务</div><div>实现远程服务后，要布远程服务供客户端使用。要实例化一个远程服务，放入RMI注册表中。注册了服务实现对象后，RMI会把Stub（桩）放入注册表，让客户端使用。</div><div>try{</div><div>    MyRemote service = new MyRemoteImpl();<br></div><div>    Naming.rebind("RemoteHello",service);<br></div><div>}catch(Exception e){</div><div>    // ...<br></div><div>}</div><div><br></div><div>第三步：生成Stub和Skeletons（桩和骨架）</div><div><br></div><div>1.在远程实现类上运行rmic（不是远程接口）</div><div>rmic MyRemoteImpl（类名，不带.class）</div><div>会生成桩和骨架代码：MyRemoteImpl_Stub.class、MyRemoteImpl_Skel.class</div><div>rmic是jdk bin目录下的工具</div><div><br></div><div>第四步：运行rmiregistry</div><div><br></div><div>1.rmiregistry</div><div>必须让rmiregistry能访问到你的服务相关类，要么把类放入classpath，要么在classes目录下直接运行rmiregistry</div><div><br></div><div>第五步：启动服务</div><div><br></div><div>1.另一个dos窗口里启动服务类</div><div>java MyRemoteImpl</div><div><br></div><div><br></div><div>客户端调用方法：</div><div>MyRemote service = (MyRemote)Naming.lookup("rmi://127.0.0.1/RemoteHello");</div><div>String msg = service.sayHello();// 调用桩的方法<br></div><div><br></div><div><div style="margin-top: 0px; margin-bottom: 0px">通过RMI registry查找服务后，返回桩，客户端必须用MyRemoteImpl_Stub.class和MyRemote.class。桩MyRemoteImpl_Stub.class、骨架MyRemoteImpl_Skel.class、MyRemote.class、MyRemoteImpl.class必须在服务端。</div><div><br></div></div><div><br></div><div>这么多乱七八糟的跟代理模式有什么关系？</div><div>其实客户端返回的MyRemote，其实是MyRemote_Stub，就是代理对象了，服务端的MyRemoteImpl及时实际对象，通过RMI，来获得远程对象的代理，再通过代理，来访问实际对象（远程服务实现类MyRemoteImpl）所实现的远程服务方法（MyRemote定义）。对应类图，每个类在代理模式中的角色分别是：</div><div>Subject：MyRemote接口</div><div>RealObject：MyRemoteImpl服务实现类</div><div>Proxy：MyRemote_Stub桩</div><div><br></div><div>在RMI中，找到服务后，拿到的MyRemote service其实是一个代理对象（MyRemote_Stub），对代理对象的方法调用，实际是通过RMI来访问远程服务实现对象的方法。也就是说代理对象MyRemote service（实际是MyRemote_Stub）通过RMI机制对远程服务对象来做<b>访问控制</b>，也就实现了代理模式。</div><div></div><h2><a name="_3253479525446892_565335180610_5202975915744901" id="_3253479525446892_565335180610_5202975915744901"></a>虚拟代理<br></h2><p>虚拟代理举的是一个Swing的例子。</p><p>我是这么理解的：一个对象的创建非常耗时，通过代理对象去调用，在真实对象创建前，返回一个假的调用，等真实对象创建好了，这时候返回给客户端的就是一个真实对象的相应方法调用。</p><p><br></p><p>也就是延迟加载的问题，Swing例子中，要显示一个Icon，但是要通过网络加载一个图片，在图片通过网络加载成功前，先显示一个“加载中，请稍候...”（如果是真实对象的调用，应该显示一个图片），在代理对象中通过后台线程去加载图片，加载完了后，再偷偷的把“加载中，请稍候...”的字样偷偷换成加载成功后的图片。</p><p><br></p><p>没想到这也算代理模式的一种应用场景。以前有这么在Swing中用过，需要从数据库中查找数据，但是比较耗时，就先显示“加载数据中，请稍候...”，等加载完了，再在JTable中显示出来。如果用代理模式的方式来思考，好像比较的好吧。。</p><p><br></p><p>同样在jsp页面里，通过ajax来加载数据好像也是这样的道理，数据没加载之前就是“加载中...”，加载完了再通过innerHTML来改变显示，也是同样的延迟加载问题。</p><p>如果用代理模式的方式来考虑，可以定义一个JavaScript类（这个类其实是个代理），这个类有个方法要显示一些从Server取出的数据，但是调用显示方法时，后台数据还没有加载，就先显示加载中请稍候之类的文本，这时候通过ajax从Server取数据（创建真实对象），取出来之后在回调函数中更新显示HTML元素的innerHTML。跟那个Swing的例子一模一样吧。不过好像JavaScript中好像没有谁会定义接口、实现、代理对象吧，但是思路其实是一样的。</p><p>不知道这样理解代理模式，算不算曲解。。。</p><p><br></p><h2><a name="JDK_23414514306932688_91246650_5588917890563607" id="JDK_23414514306932688_91246650_5588917890563607"></a>JDK动态代理<br></h2><p>jdk里的动态代理支持，主要是通过java.lang.reflect包中Proxy、InvocationHandler等几个类来实现的。具体如何实现可参考JDK中文文档。</p><p>使用场合：</p><p>好像在在一本Hibernate的书上，对数据库Connection的close方法调用，用动态代理的方式来拦截，并不真正关闭连接，而是返回到数据库连接池中。</p><p>在Spring中的拦截貌似有些是用动态代理实现的？不过动态代理使用时要基于接口，但是Spring是使用动态生成字节码的方式？对Spring内部实现机制不熟。。不敢妄自猜测。。等有时间好好研究再来说明。。</p><div>动态代理，我觉得最好的使用场合是给方法调用增加预处理和后处理，更加灵活了，可以做一些额外的事，同时也做到无侵入的解耦合，因为代理对象和实际对象的接口是一样的，唯一需要注意的地方是，客户端调用者是拿的接口，接口到底是使用代理对象还是实际对象，调用者并不知道，这就需要对代理对象的创建用类似工厂的方式来封装创建。比如一下代码：</div><div>PersonBean getOwnerProxy(PersonBean person){</div><div>    return (PersonBean)Proxy.newProxyInstance(<br></div><div>             person.getClass().getClassLoader(),<br></div><div>             person.getClass().getInterfaces(),<br></div><div>             new OwnerInvocationHandler(person));</div><div>}<br></div><div><br></div><div>PersonBean为Subject接口，OwnerInvocationHandler实现InvocationHandler接口。</div><div><br></div><h2><a name="_Decorator_" id="_Decorator_"></a>和Decorator的比较<br></h2><div>Decorator模式在jdk的java.io包中使用非常广泛。主要用来为一个类添加新的行为。</div><div>而Proxy模式中，代理对象并不对实际对象添加新的行为，只是对实际对象做访问控制。</div></div><br><img src ="http://www.blogjava.net/menlong999/aggbug/228810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/menlong999/" target="_blank">Lv Yuanfang</a> 2008-09-13 23:48 <a href="http://www.blogjava.net/menlong999/archive/2008/09/13/228810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>