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

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

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

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

?

一、观察者模式的本来面目

工作时间长了,会发现代码中的很多东西都是相通相似的,就说JAVA的事件机制其实就是观察者模式的实现,学会了观察者模式,事件机制自己无师自通,先以我的角度看看什么是观察者模式。

观察者模式,顾名思义,应该有观察者(抽象观察者“Observer”角色)和被观察者(抽象主题“Subject”角色),被观察者一旦有变化就通知观察者更新自己。

形象图:



下面是观察者模式的类图:




从我的角度简单点理解,我们知道面向对象编程不过是对象之间的相互调用,那么被观察者应该有个列表(List)来把所有观察者引用起来,当有事件要通知观察者时,我们从List中把所有观察者类取出来挨个调用观察者的方法(如update())。这个过程中只有充分利用了面向对象编程的多态,继承等特性才能实现。

下面是代码实现:

被观察者(抽象主题类):

package com.lifanghu.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-14 下午06:18:26
 * @name com.lifanghu.observer.Subject.java
 * @version 1.0
 */
public abstract class Subject {

    private List<Observer> observers = new ArrayList<Observer>();

    /**
     * 增加一个观察者
     * @param observer
     * @author lifh
     */
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
    /**
     * 删除一个观察者
     * @param observer
     * @author lifh
     */
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    /**
     * 通知所有观察者
     * @author lifh
     */
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }
}?

??

实际被观察者(真实主题角色):

package com.lifanghu.observer;

/**
 * 实际被观察者
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-14 下午10:48:02
 * @name com.lifanghu.observer.XiaoMing.java
 * @version 1.0
 */
public class XiaoMing extends Subject {

    private String state;

    //实际要通进行通知的方法
    public void change() {
        this.notifyObservers();
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}
?

?

抽象观察者:

package com.lifanghu.observer;

/**
 * 实际观察者
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-14 下午10:54:07
 * @name com.lifanghu.observer.XiaoWang.java
 * @version 1.0
 */
public class XiaoWang implements Observer {

    public void update(Subject subject) {
        XiaoMing xm = (XiaoMing) subject;
        System.out.println("小王得到通知:" + xm.getState() + ";小王说:活该!");
    }
}?

??

具体观察者1: