??xml version="1.0" encoding="utf-8" standalone="yes"?>
学习W记Q?br>http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQtMHZkLoh?hl=zh-CN
日常W记Q?br>http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQlOD34rMh?hl=zh-CN
收藏的一些电子书Q跟大家分n下。部分java书有下蝲链接Q其他的都是抓图Q都攑֜Dropbox Q文件在U存储、同步、共享服务,2G免费I间Q有windows、linux客户端,本地文g和服务器׃n可以同步Q的׃n上。需要的可以到Dropbox首页注册Q告诉我你的帐号后,我可以把׃n开攄你。我的帐Pmenlong999@gmail.com
Dropbox很不错,客户端速度很快Q还有版本控Ӟ强烈推荐Q?br />
Java
Java与模式: 阎宏的Java设计模式Q讲的很?br />
JSP2.0技术手册(部分Q?br />
thinking in java 中文版第三版Q全Q:不用多介l了
j-nio.zip QIBM developerWorks上java.nio教程Q很不错Q带源码
JUnit.in.Action中文?pdf
OReilly.Java.I.O.2nd.Edition.May.2006.chm
OReilly.Java.Network.Programming.Third.Edition.Oct.2004.chm
starting-struts2-chinese.pdfQ中文的InfoQ Struts2q你?/a>
Java NIO-Developing High Performance Applications.pdf
Struts 2 in Action.pdf
UML for Java Programmers中文?pdf
实用J2EE设计模式~程指南.pdf Q比较老的Q不q也不错Q怀旧一?br />
Linux
C++
其他
----Head First Pattern之模板方法模?/h2>
q?
q头大家都用strutsQ或者其他MVC框架Q很有人直接用Servlet了吧Q但是相信大部分人都应该知道怎么写Servlet的吧Q?
HttpServletc,覆盖里面的doGet、doPostҎ卛_Q大部分情况下,我们都是对GET和POST一样处理,一般也p么写了:
public MyServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response){
// 处理
}
public void doPost()HttpServletRequest request, HttpServletResponse response){
// 不关心get、posthQ因此post处理直接调用get处理
doGet(request, response);
}
}
Servlet只要在web.xml中部|好之后Q就可以处理览器的h了。上面代码可以看出来QdoGetҎ处理览器的GEThQdoPost处理POSTh?br />
Servlet是由Tomcat之类的servlet容器来调用处理浏览器h的,q要集成基cHttpServletQ如果大家查看HttpServlet源码的时候,׃发现Q其实里面有一?br />
protected void service(HttpServletRequest req, HttpServletResponse resp)
ҎQservlet容器实际调用的是serviceҎQserviceҎ的实现就是根据HTTPh的类型(GET、POSTQ还是其他)Q将处理委派ldoGet、doPost{方法,p些子cȝҎ来最l处理浏览器的请求?br />
由此可以看出QHttpServlet定义了一个处理的框架或者说模板Q实现Servlet只需l承HttpServletq实现doGet、doPost{方法即可?br />
是引出模板方法模式定义的时候了Q?strong>模板Ҏ模式Q在一个方法中定义一个算法的骨架Q将某些步骤推迟到子cM实现。模板方法允许子c重新定义算法的某些步骤Q而不改变法的结构?/strong>
单UMLcd如下Q?br />
public void final templateMethod(){
step1();
step2();
hook();
}
public abstract void step1();
public abstract void step2();
public void hook(){}
}
q个抽象c,定义了一个算法的骨架Q需要step1、step2Q都是抽象方法,需要子cL实现。而templateMethod是final的,即不允许子类覆盖。其中定义了Ҏ的步骤,step1、step2?br />
如下为具体实玎ͼ
public ConcreteTemplate extends Template{
public void step1(){System.out.println("step1");}
public void step2(){System.out.println("step2");}
public void hook(){System.out.println("hook");}
public static void main(String[] args){
Template temp = new ConcreteTemplate();
temp.templateMethod();
}
}
可以看到其中加入了一个hookҎQ即钩子Ҏ。hookҎ在抽象类中的实现为空Q是留给子类做一些可选的操作。如果某个子c需要一些特D额外的操作Q则可以实现hookҎQ当然也可以完全不用理会Q因为hook在抽象类中只是空Ҏ而已?br />
其他扩展Q?br />
1.可以定义多个hookҎ
2.hookҎ可以定义一个返回ؓboolean的方法,有子cL军_是否调用hookҎ?br />
egQ抽象类的templateMethod可以q样实现Q?br />
public void final templateMethod(){
step1();
step2();
if(allowHook())
hook();
}
public boolean allowHook(){return true;}
public void hook(){}
子类中可以覆盖allowHookQ以军_是否调用hookҎ?br />
3.抽象cd义的步骤Q可以有默认实现Q而非全是abstractҎ。HttpServlet中已l有doGet、doPost{方法的默认实现Q大家可以参考其源码实现?br />
更好的一个模板方法的例子是AppletQ实现自qAppletQ必ȝ承自AppletQ里面实现init、start、stop、destroy{方法即可。这些方法都是有默认实现的,如果看源码,可以发现默认实现其实都是I?br />
了解模板Ҏ模式之后Q大家可能意识到Servletq且完全按照模板Ҏ定义的那P而是有一些区别,比如提供默认doGet、doPost的实现等。这都说明,在实际编E中Qƈ非生搬硬套设计模式,而是Ҏ实际Q会做些变动或变形,但其本质不变?br />
不能Z模式而模式。那I竟什么时候需要设计模式呢Q个人理解,当你发现你的cL问题的时候,比如有重复代码了Q感觉有些不对劲了,感觉不适应以后的扩充了Q这时候不妨考虑下,是不是该设计模式出场了。?br />
Ua个h理解。。有不当之处Q请及时拍砖。?/strong>
----Head First Pattern之适配器模?/B>
很多人都有移动硬盘,它比U盘容量大的多Q体U也,携带方便Q用来拷资料、备份都很不错。ƈ且硬盘hD来越便宜Q?/FONT>120G的移动硬盘现在才300多?/FONT>
其实Ud盘里面是一块普通的W记本硬盘,q有一?/FONT>IDE口(?/FONT>SATA口,看硬盘的cd了,现在一般都?/FONT>SATA口即串口Q?/FONT>IDE口就是ƈ口)?/FONT>USB口的转换卡,?/FONT>USBU和电脑上的USB口连接v来就行了?/FONT>
我手头有一?/FONT>40G?/FONT>IDE口笔记本盘Q想?/FONT>PC电脑上用Q但又不x电脑拆开插主板的IDEU上。看到电脑上q有很多I闲?/FONT>USB口,想能不能让W记本硬盘的IDE口连到电脑的USB口?直接q肯定不行,接口不匹配啊。就ȝ子市场逛了一个下午,发现有一U{接卡Q一头可以插IDE口,一头是USB口,能连USBU,USBU就可以q电脑的USB口了。我C转接卡回到家Q把转接卡一头插在笔记本盘?/FONT>IDE口上Q另一头连?/FONT>USBU,再把USBU连到电脑的USB口上。大功告成,现在我的W记本硬盘就变成Ud盘了。{接卡是q接IDE口和USB口的适配器。这是适配器模式?/FONT>
下面看适配器的UMLcdQ?/FONT>
q个cd有点问题Q其?/FONT>Adaptee应该是一个接口,q有个实现这个接口的ConcreteAdapteeQ?/FONT>Adapter是目标接口,ConcreteAdapter必须实现AdapterQ持有一?/FONT>Adaptee。移动硬盘和适配器模式对应关pd下:
AdapterQ?USB接口
AdapteeQ笔记本盘?/FONT>IDE接口
ConcreteAdapterQ{接卡
总而言之,适配器模式就是把一个接?/FONT>AdapteeQ适配成目标接?/FONT>Adapter?/FONT>
某些时候适配器和装饰模式有点相同之处Q但是两者本质是不一L?/FONT>
Adapter是把所包装的接口,转换为另一个接口。?/FONT>Decorator是给所包装的接口,d新的行ؓ或方法?/FONT>
虚拟代理丄是一个Swing的例子?/p>
我是q么理解的:一个对象的创徏非常耗时Q通过代理对象去调用,在真实对象创建前Q返回一个假的调用,{真实对象创建好了,q时候返回给客户端的是一个真实对象的相应Ҏ调用?/p>
也就是gq加载的问题QSwing例子中,要显CZ个IconQ但是要通过|络加蝲一个图片,在图片通过|络加蝲成功前,先显CZ个“加载中Q请E?..”(如果是真实对象的调用Q应该显CZ个图片)Q在代理对象中通过后台U程d载图片,加蝲完了后,再偷L把“加载中Q请E?..”的字样偷偷换成加蝲成功后的囄?/p>
没想到这也算代理模式的一U应用场景。以前有q么在Swing中用q,需要从数据库中查找数据Q但是比较耗时Q就先显C“加载数据中Q请E?..”,{加载完了,再在JTable中显C出来。如果用代理模式的方式来思考,好像比较的好吧。?/p>
同样在jsp面里,通过ajax来加载数据好像也是这L道理Q数据没加蝲之前是“加载中...”,加蝲完了再通过innerHTML来改变显C,也是同样的gq加载问题?/p>
如果用代理模式的方式来考虑Q可以定义一个JavaScriptc(q个cd实是个代理)Q这个类有个Ҏ要显CZ些从Server取出的数据,但是调用昄ҎӞ后台数据q没有加载,先昄加蝲中请E候之cȝ文本Q这时候通过ajax从Server取数据(创徏真实对象Q,取出来之后在回调函数中更新显CHTML元素的innerHTML。跟那个Swing的例子一模一样吧。不q好像JavaScript中好像没有谁会定义接口、实现、代理对象吧Q但是思\其实是一L?/p>
不知道这L解代理模式,不曲解。。?/p>
jdk里的动态代理支持,主要是通过java.lang.reflect包中Proxy、InvocationHandler{几个类来实现的。具体如何实现可参考JDK中文文?/p>
使用场合Q?/p>
好像在在一本Hibernate的书上,Ҏ据库Connection的closeҎ调用Q用动态代理的方式来拦截,q不真正关闭q接Q而是q回到数据库q接池中?/p>
在Spring中的拦截貌似有些是用动态代理实现的Q不q动态代理用时要基于接口,但是Spring是用动态生成字节码的方式?对Spring内部实现机制不熟。。不敢妄自猜。。等有时间好好研I再来说明。?/p>