監聽器和 利 用觀察者設計模式設計一個程序

一、監聽器概念
    1、事件源:發生事件的對象。
    2、監聽器:是一個接口,監聽事件源上要發生的動作
    3、事件:事件對象一般是作爲監聽器方法的參數存在的,它封裝了發生事件的對象

二、Servlet中提供的監聽器(8個)
    八個監聽器分類:
    2.1監聽ServletContext、HttpSession、ServletRequest對象的創建和銷燬的監聽器。
        ServletContextListener:監聽ServletContext對象的創建和銷燬。
        
        HttpSessionListener:監聽HttpSession對象的創建和銷燬。
                    創建:第一次調用request.getSession()時。
                          銷燬:1、主動調用invalidate()方法
                                2、超時
                                
        ServletRequestListener:監聽ServletRequest對象的創建和銷燬。
                    
    2.2監聽ServletContext、HttpSession、ServletRequest對象中域變化(新來的,替換的,刪除的)的監聽器。
        ServletContextAttributeListener:
        HttpSessionAttributeListener:
        ServletRequestAttributeListener:
    2.3感知型監聽器:誰實現了這些接口,誰就能感知自己被怎麼着了。這種監聽器不需要註冊。
        HttpSessionActivationListener:感知自己何時隨着HttpSession對象鈍化和活化
        HttpSessionBindingListener:感知自己何時被HttpSession對象綁了(綁在域中)和解綁了。
        
    
    編寫步驟:
        1、編寫一個類實現某個監聽器接口
        2、在web.xml中註冊監聽器
            <listener>
                <listener-class>cn.usst.listener.ServletContextDemoListener</listener-class>

            </listener>

三、觀察者設計模式設計一個程序

//事件源
public class Student implements Serializable{
	private String name;
	private StudentListener listener;
	public Student(String name){//注入:通過構造方法
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void eat(){
		if(listener!=null){
			listener.preEat(new StudentEvent(this));
		}
		System.out.println("開始喫");
	}
	public void study(){
		if(listener!=null){
			listener.preStudy(new StudentEvent(this));
		}
		System.out.println("開始學");
	}
}

public class StudentEvent {
	private Object source;

	public StudentEvent(Object source){
		this.source = source;
	}
	public Object getSource() {//獲取事件源
		return source;
	}	
}

public interface StudentListener {
	void preEat(StudentEvent e);//監聽喫
	void preStudy(StudentEvent e);//監聽學
}

測試用例:

public static void main(String[] args) {
		Student s = new Student("葛付以");
		
		//註冊監聽器
		s.addStudentListener(new StudentListener() {
			
			public void preStudy(StudentEvent e) {
				Student ss = (Student) e.getSource();
				System.out.println(ss.getName()+"喝杯奶吧");
			}
			
			public void preEat(StudentEvent e) {
				Student ss = (Student) e.getSource();
				System.out.println(ss.getName()+"慢慢喫");
			}
		});
		
		s.eat();
		s.study();
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章