java监听机制_详解java的事件监听机制和观察者设计模式
首先說(shuō)說(shuō)監(jiān)聽器:
監(jiān)聽器就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序,這個(gè)程序?qū)iT用于監(jiān)聽另一個(gè)java對(duì)象的方法調(diào)用或?qū)傩愿淖?#xff0c;當(dāng)被監(jiān)聽對(duì)象發(fā)生上述事件后,監(jiān)聽器某個(gè)方法將立即被執(zhí) 行。
java的事件監(jiān)聽機(jī)制可概括為3點(diǎn):
1,java的事件監(jiān)聽機(jī)制涉及到事件源,事件監(jiān)聽器,事件對(duì)象三個(gè)組件,監(jiān)聽器一般是接口,用來(lái)約定調(diào)用方式
2,當(dāng)事件源對(duì)象上發(fā)生操作時(shí),它將會(huì)調(diào)用事件監(jiān)聽器的一個(gè)方法,并在調(diào)用該方法時(shí)傳遞事件對(duì)象過(guò)去
3,事件監(jiān)聽器?實(shí)現(xiàn)類?通常是由開發(fā)人員編寫,開發(fā)人員通過(guò)事件對(duì)象拿到事件源,從而對(duì)事件源上的操作進(jìn)行處理
事件監(jiān)聽機(jī)制在java圖形用戶界面那一塊用的最多,我們舉個(gè)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);
//綁定事件對(duì)象
frame.addWindowListener(new MyListener());
}
}
//監(jiān)聽器
class MyListener extends WindowAdapter
{
//當(dāng)點(diǎn)擊了關(guān)閉按鈕是觸發(fā)的函數(shù),e是事件對(duì)象,通過(guò)事件對(duì)象可以獲得事件源
@Override
public void windowClosing(WindowEvent e)
{
Frame f = (Frame) e.getSource();
f.dispose();
}
}
到這里,大家應(yīng)該對(duì)事件監(jiān)聽機(jī)制有所理解。接下來(lái)我們就進(jìn)入觀察者模式,大家只要明白了事件監(jiān)聽機(jī)制,那么觀察者模式就明白了,我們可以這樣去理解觀察者模式:
觀察者模式:觀察者(Observer)相當(dāng)于事件監(jiān)器,被觀察者(Observable)相當(dāng)于事件源和事件,執(zhí)行事件源邏輯時(shí)通知observer觸發(fā)oberver的方法調(diào)用,同時(shí)可傳被觀察者
舉個(gè)簡(jiǎn)單示例
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........");
}
// 注冊(cè)監(jiān)聽器
public void registerListener(PersonListener listener)
{
this.listener = listener;
}
}
// 監(jiān)聽器
interface PersonListener
{
public void doRun(Even e);
public void doEat(Even e);
}
// 事件對(duì)象
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;
}
}
到這里相信大家對(duì)Java的事件監(jiān)聽機(jī)制和觀察者模式都很明白了,最后說(shuō)一下事件監(jiān)聽機(jī)制或者觀察者模式在javaee開發(fā)中的應(yīng)用。這種設(shè)計(jì)模式體現(xiàn)在servlet的事件監(jiān)聽器,
在Servlet規(guī)范中定義了多種類型的監(jiān)聽器,它們用于監(jiān)聽的事件源分別為 ServletContext, HttpSession 和 ServletRequest 這三個(gè)域?qū)ο?#xff0c;Servlet規(guī)范針對(duì)這三個(gè)對(duì)象上的操作,又把這多種類型的監(jiān)聽器劃分為三種類型
1,監(jiān)聽三個(gè)域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器
2,監(jiān)聽域?qū)ο笾袑傩缘脑黾雍蛣h除的事件監(jiān)聽器
3,監(jiān)聽綁定到 HttpSession 域中的某個(gè)對(duì)象的狀態(tài)的事件監(jiān)聽器。(查看API文檔)
最后寫一個(gè)servlet的監(jiān)聽器監(jiān)聽當(dāng)前網(wǎng)站的在線用戶量,這個(gè)值不是很準(zhǔn)確
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
{
//當(dāng)session創(chuàng)建時(shí)調(diào)用該方法
public void sessionCreated(HttpSessionEvent se)
//將在線用戶數(shù)量的值保持到ServletContext中,已便所有用戶看到
ServletContext context = se.getSession().getServletContext();
//第一次獲取沒有
if(count==null)
{
count = 1;
context.setAttribute("count", count);
}
else
{
count++;
context.setAttribute("count", count);
}
}
//session銷毀的時(shí)候調(diào)用該方法,把存在ServletContext中的數(shù)量值減一
public void sessionDestroyed(HttpSessionEvent se)
{
ServletContext context = se.getSession().getServletContext();
Integer count = (Integer) context.getAttribute("count");
count--;
context.setAttribute("count", count);
}
}
總結(jié)
以上是生活随笔為你收集整理的java监听机制_详解java的事件监听机制和观察者设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 交通银行白金卡相关问题及分析
- 下一篇: esp8266 micropython
