日期:2014-05-17  浏览次数:20874 次

深入解析Apache Mina源码(1)——Mina的过滤器机制实现


1、深入解析Apache Mina源码(1)——Mina的过滤器机制实现

2、深入解析Apache Mina源码(2)——Mina的事件模型

一、责任链模式的本来面目

Mina?中有一个重要的设计模式-责任链模式,它将此模式成功的应用在了它的过滤器链(IoFilterChain)中。开发过J2EE的童鞋们应该对这个模式比较清楚,在Servlet中我们就可以加入Filter的实现,还有Hibernate中也实现了FilterChain。学习怎么实现责任链模式对于我们对开源软件的学习和以后的工作都会有莫大的帮助。

我们知道计算机系统就是接收信息,进行信息处理,信息输出的过程,那么在这个过程中我们加入过滤器有很多好处,消息经过特定功能的多个过滤器进行逐步处理得到所需要的最终信息,让处理过程透明,责任明晰,方便扩展。

责任链模式的定义我也就不说了,网上一大堆,我的理解是可以把它理解成一个有向链表,消息在这个链表中的某个过滤器进行处理然后再传向下个过滤器,在每个过滤器中都可以处理这些消息,也可以不处理。如图:


责任链模式的类图如下:


其实这里面最核心的就是Handler了,它可是是一个接口或者是一个抽象类,它有对自己的一个引用successor,然后有个处理方法HandleRequest()。因为有了对自己的引用successor所以当本对象不能处理的时候可以转向successor.HandleRequest()方法,这样一个“链”就形成了。

你应该挺羡慕富士.康里面生产苹果手机的工人吧,你平时最喜欢的苹果手机就是他们生产出来的,他们一个人就能把苹果手机生产出来吗?不是的,他们是流水线做业的,OK,流水线就可以看做是责任链模式的体现,工人就是链条上的一员,有的工人组装屏幕,有的工人检查手机,有的工人进行手机的包装等,下面我们就以代码的方式实现:

苹果手机类:

package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:20:18
 * @name com.lifanghu.chain.Iphone.java
 * @version 1.0
 */

public class Iphone {

    private String state = "我是一台苹果机器;";

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

}
?

抽象处理接口类:

package com.lifanghu.chain;



/**
 * @author  lifh
 * @mail    wslfh2005@163.com
 * @since   2012-6-12 下午11:23:36
 * @name    com.lifanghu.chain.IWorker.java
 * @version 1.0
 */

public interface IWorker {

    /**
     * 处理方法
     * @param iphone
     * @author lifh
     */
    void handleIphone(Iphone iphone);
    /**
     * 设置下一个处理者
     * @param worker
     * @author lifh
     */
    void setNext(IWorker worker);
}
?

具体处理者:

package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:29:46
 * @name com.lifanghu.chain.Worker1.java
 * @version 1.0
 */

public class Worker1 implements IWorker {

    private IWorker next;

    public void handleIphone(Iphone iphone) {
        iphone.setState(iphone.getState() + "我被装了一个黑色的后盖;");
        if (next != null)
            next.handleIphone(iphone);
    }

    public void setNext(IWorker worker) {
        this.next = worker;

    }

}
package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:34:32
 * @name com.lifanghu.chain.Worker2.java
 * @version 1.0
 */

public class Worker2 implements IWorker {

    private IWorker next;

    public void handleIphone(Iphone iphone) {
        iphone.setState(iphone.getState() + "我被装了一块电池;");
        if (next != null)
            next.handleIphone(ipho