文档章节

详解java的事件监听机制和观察者设计模式

y
 yjl920684289
发布于 2017/04/17 13:50
字数 991
阅读 11
收藏 1

 

 

原文  http://blog.csdn.net/u010548376/article/details/24884453

主题 Java 设计模式

首先说说监听器:

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执 行。 

java的事件监听机制可概括为3点:

1,java的事件监听机制涉及到事件源,事件监听器,事件对象三个组件,监听器一般是接口,用来约定调用方式 
2,当事件源对象上发生操作时,它将会调用事件监听器的一个方法,并在调用该方法时传递事件对象过去 
3,事件监听器 实现类 通常是由开发人员编写,开发人员通过事件对象拿到事件源,从而对事件源上的操作进行处理

事件监听机制在java图形用户界面那一块用的最多,我们举个awt例子:

package cn.lmj.demo; 
import java.awt.Frame; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
public class Demo 


public static void main(String[] args) 

//事件源 
Frame frame = new Frame(); 
frame.setSize(300,300); 
frame.setVisible(true); 
//绑定事件对象 
frame.addWindowListener(new MyListener()); 


//监听器 
class MyListener extends WindowAdapter 

//当点击了关闭按钮是触发的函数,e是事件对象,通过事件对象可以获得事件源 
@Override 
public void windowClosing(WindowEvent e) 

Frame f = (Frame) e.getSource(); 
f.dispose(); 

}

到这里,大家应该对事件监听机制有所理解。接下来我们就进入观察者模式,大家只要明白了事件监听机制,那么观察者模式就明白了,我们可以这样去理解观察者模式:

观察者模式:观察者(Observer)相当于事件监器,被观察者(Observable)相当于事件源和事件,执行事件源逻辑时通知observer触发oberver的方法调用,同时可传被观察者 

举个简单示例

package cn.lmj.observer; 
public class Demo 

public static void main(String[] args) 

Person p = new Person(); 
p.registerListener(new PersonListener() 

@Override 
public void doRun(Even e) 

System.out.println(e.getP() + " is running"); 

@Override 
public void doEat(Even e) 

System.out.println(e.getP() + " is eatting"); 

}); 
p.run(); 
p.eat(); 


// 事件源 
class Person 

private PersonListener listener; 
public void run() 

if (listener != null) 

listener.doRun(new Even(this)); 

System.out.println("run........"); 

public void eat() 

if (listener != null) 

listener.doEat(new Even(this)); 

System.out.println("eat........"); 

// 注册监听器 
public void registerListener(PersonListener listener) 

this.listener = listener; 


// 监听器 
interface PersonListener 

public void doRun(Even e); 
public void doEat(Even e); 

// 事件对象 
class Even 

private Person p; 
public Even() 

super(); 

public Even(Person p) 

super(); 
this.p = p; 

public Person getP() 

return p; 

public void setP(Person p) 

this.p = p; 

到这里相信大家对Java的事件监听机制和观察者模式都很明白了,最后说一下事件监听机制或者观察者模式在javaee开发中的应用。这种设计模式体现在servlet的事件监听器,

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象,Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型 

   1,监听三个域对象创建和销毁的事件监听器 
2,监听域对象中属性的增加和删除的事件监听器 
3,监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。(查看API文档)

最后写一个servlet的监听器监听当前网站的在线用户量,这个值不是很准确

package cn.lmj.web.listener.exapmle; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 
public class CountNumListener implements HttpSessionListener  
{

//当session创建时调用该方法 
public void sessionCreated(HttpSessionEvent se)  

//将在线用户数量的值保持到ServletContext中,已便所有用户看到

ServletContext context = se.getSession().getServletContext(); 

//第一次获取没有 
if(count==null) 

count = 1; 
context.setAttribute("count", count); 

else 

count++; 
context.setAttribute("count", count); 


//session销毁的时候调用该方法,把存在ServletContext中的数量值减一 
public void sessionDestroyed(HttpSessionEvent se)  

ServletContext context = se.getSession().getServletContext(); 
Integer count = (Integer) context.getAttribute("count"); 
count--; 
context.setAttribute("count", count); 

本文转载自:原文  http://blog.csdn.net/u010548376/article/details/24884453

y
粉丝 0
博文 2
码字总数 401
作品 0
成都
私信 提问
(六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目中有可能用到的设计模式,即观察者模式。 说起观察者模式,LZ还是非常激动的,当初这算是第一个让LZ感受到设计模式强大的家伙。当...

Sheamus
2015/01/29
0
0
折腾Java设计模式之观察者模式

观察者模式 Define a one-to-many dependency between objects where a state change in one object results in all its dependents being notified and updated automatically. 直译过来就是......

大萌小路
04/08
0
0
设计模式之「观察者模式」(Observer)

简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象...

柳哥
2014/12/16
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
设计模式17——Observer设计模式

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当...

小米米儿小
2014/01/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【阴阳师】真蛇10层记录

蛇切黑体系 追月神 散件一速,速度越高越好(220+) 镰鼬 招财二速,速度211以上; 山兔 火灵三速,速度180-200均可; 丑女 心眼四速,速度170左右即可; 大蛇 蚌精暴击套。速度高于阴阳师即...

Areya
15分钟前
3
0
js动态设置元素高度

this.$refs.xxx.style.height= this.contentHeight; 元素需要绑定

Carbenson
52分钟前
2
0
今天的学习

今天学到了ci框架中的查询语句的where条件语句: 1、$this->db->select('')->from('')->where('id = ??')->get()->result_array();2、$this->db->select('')->from('')->where('id', '??'......

墨冥
今天
2
0
MySQL在高并发下的订单撮合、系统使用、共享锁与排他锁保证数据一致性

前序 距离上次择文发表,两月余久。2018年也即将要结束了,目前的工作依然是与区块链应用相关的,也很荣幸在9月初受邀签约出版暂名为《区块链以太坊DApp实战开发》一书,预计在明年年初出版。...

我最喜欢三大框架
今天
2
0
深入理解Flutter多线程

该文章属于<简书 — 刘小壮>原创,转载请注明: <简书 — 刘小壮> https://www.jianshu.com/p/54da18ed1a9e Flutter默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。 ...

刘小壮
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部