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

一、监听器概念

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();
	}

监听器和 利 用观察者设计模式设计一个程序,布布扣,bubuko.com

时间: 2024-08-06 03:45:27

监听器和 利 用观察者设计模式设计一个程序的相关文章

设计一个程序能够将某一个目录下面的所有文件名打印出来---File类的使用

,设计一个程序能够将某一个目录下面的所有文件名打印出来 运用到的方法有:返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录:list()           测试此抽象路径名表示的文件是否是一个目录:isDirectory()           返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件:listFiles() package printfilename; import java.io.File; public class PrintFileNam

4.设计一个程序,计算1~20之间所有能被3整除的数之和。

TITLE:设计一个程序,计算1~20之间所有能被3整除的数之和. ANSWER1: 1 #include <stdio.h> 2 3 int main(){ 4 int i,ans=0; 5 for(i=1;i<=20;i++){ 6 ans+=i%3?0:i; 7 } 8 printf("%d\n",ans); 9 return 0; 10 } ANSWER2: 1 #include <stdio.h> 2 3 int main(){ 4 int i,

设计一个程序,让它能够返回一个整数数组最大子数的和,并能完成几项测试

实验人员:常啸帆,毕文强 实验要求:必须能处理1000个元素: 每个元素是int32类型的,出现子数组之和大于显示最大范围会出现什么情况: 输入一个整形数组,有正也有负: 数组中连续的一个或多个整数组成一个数组,每个子数组都必须有一个和: 求所有子数组和的最大值,要求时间复杂度为o(n).实验过程:在本次实验中,我们两人通过所学的c++知识来编写程序,在过程中我们发现了一下问题并逐步解决 在编写的过程中,首先会发现数组中少了一个元素,那是因为在循环时length写成了length-1,     

设计一个程序,程序中有三个类,Triangle,Lader,Circle,

//此程序写出三个类,triangle,lader,circle:其中triangle类具有类型为double的a,b,c边以及周长,面积属性,//具有周长,面积以及修改三边的功能,还有判断能否构成三角形的boolean类.//lader类具有类型为double的上底下底和高,面积属性,具有返回面积的功能//circlle 类具有类型为double的半径,周长和面积.具有返回周长面积的功能.//Triangle类 class triangle{ public double a; public d

设计模式: 自己手动实现一个观察者设计模式

观察者模式: 定义了对象之间的一对多依赖,这样一来.当一个对象(被观察者)改变状态时,它的全部依赖者(观察者)都会收到通知并自己主动更新. 在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型. 用这个模式, 你能够改变依赖主题状态的对象.却不必改变主题.这叫提前规划. 主题和观察者都使用接口:观察者利用主题的接口向主题注冊.而主题利用观察者的接口通知观察者.这样能够让两者之间运作正常,有同一时候具有松耦合的长处. 观察者模式利用"组合"将很多观察者组合进主题中.对象之间的这样

Java事件监听机制与观察者设计模式

一. Java事件监听机制 1. 事件监听三要素: 事件源,事件对象,事件监听器 2. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对象传递进去,开发者可以利用事件对象操作事件源. 3. 入门程序 1 /** 2 * Created by IntelliJ IDEA. 3 * 4 * @Auther: ShaoHsiung 5 * @Date: 2018/8/29 21:25 6 * @Title: 事件监听入门程序 7 * @D

观察者设计模式

/** * 事件接口即被观察者 * * @author Host * */ publicinterface Event { void attach(Listener listener); void detach(Listener listener); void notifyListener(); } /** * 事件监听者观察者 * * @author Host * */ publicinterface Listener { void execute(); } 事件源的一个实现类(磁盘事件) p

[转] 如何应用设计模式设计你的足球引擎(一和二)----Design Football Game(Part I and II)

原文地址: http://www.codeproject.com/KB/architecture/applyingpatterns.aspx 作者:An 'OOP' Madhusudanan 译者:赖勇浩(http://blog.csdn.net/lanphaday ) 译者说:这是一篇非常好的文章,有非常棒的例子,非常棒的文笔,非常棒的代码(VB.net编写的,但你肯定读得懂),如果你还不懂设计模式,那它肯定是最适合你的 DPs 文章之一. 第一部分 解决方案架构师:你可以尝试使用模式 愚蠢的

Design Pattern - Observer 观察者设计模式

Spy on enemy. 使用这个模式可以根据某些事件自动更新. 设计思路: 1 设计一个基类,作为需要观察一个时间行为的接口类 2 设计一个观察者类,可以观察所有基类的衍生类, 这里使用set来保存这些需要更新的类. 一个事件相当于一个函数,事件发生(调用函数)同时自动调用需要更新的函数动作. #pragma once #include <iostream> #include <string> #include <set> #include <vector&g