首页 > 代码库 > 监听器和 利 用观察者设计模式设计一个程序

监听器和 利 用观察者设计模式设计一个程序

一、监听器概念
    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();
	}



监听器和 利 用观察者设计模式设计一个程序