java

位置:IT落伍者 >> java >> 浏览文章

Java中使用观察者模式实现自定义事件


发布日期:2023年07月11日
 
Java中使用观察者模式实现自定义事件

MyEventTestjava:

package wintysevent;

import javaxswingeventEventListenerList;

import javautilDate;

import javatextDateFormat;

import javatextSimpleDateFormat;

/**

* Java的事件机制/自定义事件

运行结果:

do something interesting in source here

listener detects [event]:wintyseventMyEvent[source=wintyseventMySource@

] [occur at]: ::

listener detects [event]:wintyseventMyEvent[source=wintyseventMySource@

] [occur at]: ::

* @version

* @author 天堂露珠 ()

* @see

*/

class MyEventTest{

public static void main(String[] args){

MySource source = new MySource();

MyListener myListener = new MyListener(){

public void doMyAction(MyEvent e){

Systemoutprintln(listener detects + e);

}

};

sourceaddMyListener(myListener);

sourceaddMyListener(myListener);

sourceaddMyListener(myListener);

sourceremoveMyListener(myListener);

sourcedoSomething();

}

}

/**

* 自定义的事件

* @version

* @author 天堂露珠()

* @see

*/

class MyEvent extends javautilEventObject{

private Date date;//记录事件发生的时间

public MyEvent(Object source Date date){

super(source);

thisdate = date;

}

public String toString(){

DateFormat df = new SimpleDateFormat(yyyyMMdd HH:mm:ss);

String dt = dfformat(date);

return [event]: + supertoString() + [occur at]: + dt;

}

}

/**

* 自定义事件监听器接口

* @version

* @author 天堂露珠()

* @see

*/

interface MyListener extends javautilEventListener{

void doMyAction(MyEvent e);

}

/**

* 自定义事件源

* @version

* @author 天堂露珠()

* @see

*/

class MySource{

/**

* 保存注册的监听器列表

* 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表

*/

protected EventListenerList listenerList = new EventListenerList();

private MyEvent myEvent = null;//fireDoMyAction()使用此变量

/**

* 没有做任何事

*/

public MySource(){

}

/**

* 添加一个MyListener监听器

*/

public void addMyListener(MyListener listener){

listenerListadd(MyListenerclass listener);

}

/**

* 移除一个已注册的MyListener监听器

* 如果监听器列表中已有相同的监听器listenerlistener

* 并且listener==listener

* 那么只移除最近注册的一个监听器

*/

public void removeMyListener(MyListener listener){

listenerListremove(MyListenerclass listener);

}

/**

* @return 在此对象上监听的所有MyListener类型的监听器

*/

public MyListener[] getMyListeners(){

return (MyListener[])listenerListgetListeners(MyListenerclass);

}

//Winty:Copy directly from javaxswingeventEventListenerList

/*Notify all listeners that have registered interest for

notification on this event type The event instance

is lazily created using the parameters passed into

the fire method

*/

protected void fireDoMyAction() {

// getListenerList() Guaranteed to return a nonnull array

Object[] listeners = listenerListgetListenerList();

// Process the listeners last to first notifying

// those that are interested in this event

for (int i = listenerslength; i>=; i=) {

if (listeners[i]==MyListenerclass) {

// Lazily create the event:

if (myEvent == null)

myEvent = new MyEvent(this new Date());

((MyListener)listeners[i+])doMyAction(myEvent);

}

}

}

/**

* 做一些事件源应该做的有意义的事然后通知监听器

* 这里只是一个示例方法

* 例如:MySource如果是一个按钮则doSomething()就可以命名为click()

* 当用户点击按钮时调用click()方法

*/

public void doSomething() {

Systemoutprintln(do something interesting here);

fireDoMyAction();//通知监听器

}

}

EventListenerList是特别需要说明的它内部使用一个Object数组存放监听器但是它并不是直接存放而是先存监听器的class类型然后再存监听器本身即存放(MyListenerclass myListener)一个Object数组可以存放多种类型的Listener如果还有一种监听器AnotherListener那么(AnotherListenerclass anotherListener)也可以存放无论增删都是两个对象一同被添加或删除上述代码中的listenerListadd(MyListenerclass listener)或listenerListremove(MyListenerclass listener)以及fireDoMyAction()中的i=就是这样操作的

               

上一篇:JavaBean实现JSP页面和代码分离

下一篇:Java的ClassLoader与Package机制