2008年9月14日

http://adrop.me/ 

posted @ 2012-10-18 23:48 Lv Yuanfang 阅读(209) | 评论 (0)编辑 收藏

     摘要: 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 ...  阅读全文

posted @ 2009-08-16 17:42 Lv Yuanfang 阅读(3953) | 评论 (0)编辑 收藏

工作笔记分享

国庆假期中,粗略看了下Unix网络编程卷一:套接字API。进一步加深了对Linux、Unix下的socket处理。重点是非阻塞、select多路复用等。记录笔记几篇。其他笔记为日常摘录等。
用Google Notebook记录,特发布和大家分享:
学习笔记:
http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQtMHZkLoh?hl=zh-CN
日常笔记:
http://www.google.com/notebook/public/09783819863799136882/BDRihIgoQlOD34rMh?hl=zh-CN



posted @ 2008-10-02 20:24 Lv Yuanfang 阅读(221) | 评论 (0)编辑 收藏

Java、Linux、C++电子书分享


收藏的一些电子书,跟大家分享下。部分java书有下载链接,其他的都是抓图,都放在Dropbox (文件在线存储、同步、共享服务,2G免费空间,有windows、linux客户端,本地文件和服务器共享可以同步)的共享上。需要的可以到Dropbox首页注册,告诉我你的帐号后,我可以把共享开放给你。我的帐号:menlong999@gmail.com
Dropbox很不错,客户端速度很快,还有版本控制,强烈推荐!

Java

Java与模式: 阎宏的Java设计模式,讲的很好
JSP2.0技术手册(部分)
thinking in java 中文版第三版(全):不用多介绍了
j-nio.zip :IBM developerWorks上java.nio教程,很不错,带源码
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.pdf:中文的InfoQ Struts2迷你书
Java NIO-Developing High Performance Applications.pdf
Struts 2 in Action.pdf
UML for Java Programmers中文版.pdf
实用J2EE设计模式编程指南.pdf :比较老的,不过也不错,怀旧一把

Linux

C++

其他














posted @ 2008-09-28 21:21 Lv Yuanfang 阅读(594) | 评论 (1)编辑 收藏

Servlet与模板方法模式

----Head First Pattern之模板方法模式


这 年头大家都用struts,或者其他MVC框架,很少有人直接用Servlet了吧,但是相信大部分人都应该知道怎么写Servlet的吧,继承 HttpServlet类,覆盖里面的doGet、doPost方法即可,大部分情况下,我们都是对GET和POST一样处理,一般也就这么写了:
public MyServlet extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response){
        // 处理
    }
    public void doPost()HttpServletRequest request, HttpServletResponse response){
        // 不关心get、post请求,因此post处理直接调用get处理
        doGet(request, response);
    }
}
Servlet只要在web.xml中部署好之后,就可以处理浏览器的请求了。上面代码可以看出来,doGet方法处理浏览器的GET请求,doPost处理POST请求。
Servlet是由Tomcat之类的servlet容器来调用处理浏览器请求的,并需要集成基类HttpServlet,如果大家查看HttpServlet源码的时候,就会发现,其实里面有一个
protected void service(HttpServletRequest req, HttpServletResponse resp)
方法,servlet容器实际调用的是service方法,service方法的实现就是根据HTTP请求的类型(GET、POST,还是其他),将处理委派给doGet、doPost等方法,由这些子类的方法来最终处理浏览器的请求。

由此可以看出,HttpServlet定义了一个处理的框架或者说模板,实现Servlet只需继承HttpServlet并实现doGet、doPost等方法即可。

是引出模板方法模式定义的时候了,模板方法模式:在一个方法中定义一个算法的骨架,将某些步骤推迟到子类中实现。模板方法允许子类重新定义算法的某些步骤,而不改变算法的结构。
简单UML类图如下:
简单实现一个抽象类:
public abstract Template{
    public void final templateMethod(){
        step1();
        step2();
        hook();
    }
    public abstract void step1();
    public abstract void step2();
    public void hook(){}
}

这个抽象类,定义了一个算法的骨架,需要step1、step2,都是抽象方法,需要子类来实现。而templateMethod是final的,即不允许子类覆盖。其中定义了方法的步骤,step1、step2。
如下为具体实现:
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方法,即钩子方法。hook方法在抽象类中的实现为空,是留给子类做一些可选的操作。如果某个子类需要一些特殊额外的操作,则可以实现hook方法,当然也可以完全不用理会,因为hook在抽象类中只是空方法而已。

其他扩展:
1.可以定义多个hook方法
2.hook方法可以定义一个返回为boolean的方法,有子类来决定是否调用hook方法。
eg:抽象类的templateMethod可以这样实现:
    public void final templateMethod(){
        step1();
        step2();
        if(allowHook())
            hook();
    }
    public boolean allowHook(){return true;}
    public void hook(){}
子类中可以覆盖allowHook,以决定是否调用hook方法。
3.抽象类定义的步骤,可以有默认实现,而非全是abstract方法。HttpServlet中已经有doGet、doPost等方法的默认实现,大家可以参考其源码实现。

更好的一个模板方法的例子是Applet,实现自己的Applet,必须继承自Applet,里面实现init、start、stop、destroy等方法即可。这些方法都是有默认实现的,如果看源码,可以发现默认实现其实都是空。

了解模板方法模式之后,大家可能意识到Servlet并且完全按照模板方法定义的那样,而是有一些区别,比如提供默认doGet、doPost的实现等。这都说明,在实际编程中,并非生搬硬套设计模式,而是根据实际,会做些变动或变形,但其本质不变。
不能为了模式而模式。那究竟什么时候需要设计模式呢?个人理解,当你发现你的类有问题的时候,比如有重复代码了,感觉有些不对劲了,感觉不适应以后的扩充了,这时候不妨考虑下,是不是该设计模式出场了。。
纯粹个人理解。。有不当之处,请及时拍砖。。


posted @ 2008-09-17 09:40 Lv Yuanfang 阅读(1724) | 评论 (0)编辑 收藏

我写东西,都是在Google Docs上写,然后用Docs的发布功能,发布到blog上。以前的几篇都可以顺利发布到blogjava上,也没有乱码,以前在csdn上有乱码。今天突然不能发布了,也没有任何错误提示。是Google Docs的问题,还是blogjava的问题?
有人像我这样用docs写,然后发布blog吗?

posted @ 2008-09-17 00:02 Lv Yuanfang 阅读(219) | 评论 (0)编辑 收藏

移动硬盘与适配器模式

----Head First Pattern之适配器模式

很多人都有移动硬盘,它比U盘容量大的多,体积也小,携带方便,用来拷资料、备份都很不错。并且硬盘价格越来越便宜,120G的移动硬盘现在才300多。


其实移动硬盘里面就是一块普通的笔记本硬盘,还有一个IDE口(或SATA口,看硬盘的类型了,现在一般都是SATA口即串口,IDE口就是并口)和USB口的转换卡,用USB线和电脑上的USB口连接起来就行了。


我手头有一个40GIDE口笔记本硬盘,想在PC电脑上用,但又不想把电脑拆开插主板的IDE线上。看到电脑上还有很多空闲的USB口,就想能不能让笔记本硬盘的IDE口连到电脑的USB口?直接连肯定不行,接口不匹配啊。就去电子市场逛了一个下午,发现有一种转接卡,一头可以插IDE口,一头是USB口,能连USB线,USB线就可以连电脑的USB口了。我买了转接卡回到家,把转接卡一头插在笔记本硬盘的IDE口上,另一头连上USB线,再把USB线连到电脑的USB口上。大功告成,现在我的笔记本硬盘就变成移动硬盘了。转接卡就是连接IDE口和USB口的适配器。这就是适配器模式。

下面看适配器的UML类图:

这个类图有点问题,其实Adaptee应该是一个接口,还有个实现这个接口的ConcreteAdaptee,而Adapter是目标接口,ConcreteAdapter必须实现Adapter,持有一个Adaptee。移动硬盘和适配器模式对应关系如下:

AdapterUSB接口

Adaptee:笔记本硬盘的IDE接口

ConcreteAdapter:转接卡


总而言之,适配器模式就是把一个接口Adaptee,适配成目标接口Adapter


某些时候适配器和装饰模式有点相同之处,但是两者本质是不一样的。

Adapter是把所包装的接口,转换为另一个接口。而Decorator是给所包装的接口,添加新的行为或方法。


posted @ 2008-09-15 17:53 Lv Yuanfang 阅读(299) | 评论 (0)编辑 收藏

多线程环境下的单例模式实现

----Head First Pattern之单例模式



单例模式我想大家都比较熟悉,就是在JVM运行期间一个类只有一个实例,任何时候都是取得同一个实例,也就是一个全局变量了。
单例模式分懒汉式和饿汉式,但是懒汉式的单例在多线程环境下会有同步的问题,下面详细介绍了用3中方法来解决此问题。
单例模式具有以下几个特点:
1.JVM运行期间有且只有一个实例
2.构造函数是私有的
3.通过一个静态工厂方法来获得唯一的实例
4.累内部有一个私有静态实例,通过静态工厂方法创建后,每次再调用静态工厂方法,返回的都是同一个实例

饿汉式:
public class Singleton{
    private static Singleton uniqueInstance = new Singleton();
    // 其他实例变量
    private Singleton(){}
    public static Singleton getInstance(){
        return uniqueInstance;
    }
    
    // 其他方法
}

懒汉式:
public class Singleton{
    private static Singleton uniqueInstance;
    // 其他实例变量
    private Singleton(){}
    public static Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Signleton();
        }
        return uniqueInstance;
    }
    
    // 其他方法
}

多线程环境下的单例模式:
上面的代码就是最基本的单例模式示例代码。但是懒汉式单例有一个问题,因为要保证有且仅有一个实例,如果在多线程环境下调用Singleton.getInstance(),就可能会有多个实例!为了解决多线程访问的问题,有3种解决方法供选择:

1.静态工厂方法加同步关键字,这种方法是在对性能要求不高的情况下采用。
public class Singleton{
    private static Singleton uniqueInstance;
    // 其他实例变量
    private Singleton(){}
    public static synchronised Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Signleton();
        }
        return uniqueInstance;
    }
    
    // 其他方法
}

2.始终用饿汉式单例
public class Singleton{
    private static Singleton uniqueInstance = new Singleton();
    // 其他实例变量
    private Singleton(){}
    public static Singleton getInstance(){
        return uniqueInstance;
    }
    
    // 其他方法
}
饿汉式的方法,会依赖于JVM在加载类的时候,就创建唯一的实例。在每个线程访问getInstance方法前,唯一实例已经被创建。

3.用双检查锁来减少懒汉式中静态方法getInstance的同步开销
对public static synchronised Singleton getInstance()的每次调用,都需要同步,而双检查锁的方式只是在第一次创建实例时同步,其他时候并不需要同步。
public class Singleton{
    private volatile static Singleton uniqueInstance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(uniqueInstance == null){
            synchronised(Singleton.class){
                if(uniqueInstance == null){
                       uniqueInstance = new Singleton();
                }
            }

        }
        return uniqueInstance;
    }
}

如果调用时实例为null,则进入同步区块,此时再进行判断,如果还为null,就创建唯一的实例。有可能在一个线程在 if(uniqueInstance == null) 后进入同步区块前,另一个线程恰好已经创建成功并从同步区块中出来,这就需要进入同步区块后,再做uniqueInstance是否为null的判断。
同时uniqueInstance需要加volatile关键字,保证在创建单例实例时,多个线程能正确处理uniqueInstance变量。

注意:
双检查锁的方式在Java1.4及1.4以前版本不能工作!!因此双检查锁只能在Java 5及以上版本才可以使用。
记得Effictive Java中也提到过双检查锁,也说不能在Java1.4中使用。
原因是Java 1.4及以前的JVM中对volatile关键字的实现允许对双检查锁不合适的同步。(谁能帮我再深入解释下?)原文是:
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.


posted @ 2008-09-14 15:40 Lv Yuanfang 阅读(431) | 评论 (0)编辑 收藏

新博开张


最早用的是blogger,不过一直被封。。偶尔解封几天又被封。现在托奥运的福,已经解了。但愿以后不要再被封。可恶的GFW。。。。

后来用csdn,人够多,但是也够烂。一直也没坚持写多少东西,都是决心下了,就是懒的动手写,并且发现写东西的时候,老是前言不对后尾,前面说什么还没说完,后来就开始跑题,还有,写作水平好像越来越差,总感觉一句话写的不明不白,甚至还有点啰嗦。

始终觉得cnblog还行,界面够简单,也够丑的了。。几乎都是技术的。平时也有订阅。今天终于搬来,竟然还需要人工审核,没想到。

不过写博,毕竟是为了让人看,如果有很多评论,或者很多人订阅rss,肯定非常非常有成就感!!
被人捧也好,被人骂也好,被人褒扬也好,被人拍砖也好,只要有人来看,就是好!!

以后有空还是多写写的好。

posted @ 2008-09-14 00:06 Lv Yuanfang 阅读(160) | 评论 (0)编辑 收藏


posts - 11, comments - 2, trackbacks - 0, articles - 0

Copyright © Lv Yuanfang