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

Python017

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

MyEventTest java:

package wintys event

import javax swing event EventListenerList

import java util Date

import java text DateFormat

import java text SimpleDateFormat

/**

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

运行结果:

do something interesting in source here

listener detects [event]:wintys event MyEvent[source=wintys event MySource@

] [occur at]: : :

listener detects [event]:wintys event MyEvent[source=wintys event MySource@

] [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){

System out println( listener detects + e)

}

}

source addMyListener(myListener)

source addMyListener(myListener)

source addMyListener(myListener)

source removeMyListener(myListener)

source doSomething()

}

}

/**

* 自定义的事件

* @version

* @author 天堂露珠()

* @see

*/

class MyEvent extends java util EventObject{

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

public MyEvent(Object source Date date){

super(source)

this date = date

}

public String toString(){

DateFormat df = new SimpleDateFormat( yyyy MM dd HH:mm:ss )

String dt = df format(date)

return [event]: + super toString() + [occur at]: + dt

}

}

/**

* 自定义事件监听器接口

* @version

* @author 天堂露珠()

* @see

*/

interface MyListener extends java util EventListener{

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){

listenerList add(MyListener class listener)

}

/**

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

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

* 并且listener ==listener

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

*/

public void removeMyListener(MyListener listener){

listenerList remove(MyListener class listener)

}

/**

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

*/

public MyListener[] getMyListeners(){

return (MyListener[])listenerList getListeners(MyListener class)

}

//Winty:Copy directly from javax swing event EventListenerList

/*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 non null array

Object[] listeners = listenerList getListenerList()

// Process the listeners last to first notifying

// those that are interested in this event

for (int i = listeners length i>= i = ) {

if (listeners[i]==MyListener class) {

// 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() {

System out println( do something interesting here )

fireDoMyAction()//通知监听器

}

}

lishixinzhi/Article/program/Java/hx/201311/26237

java 自定义监听器监听属性变化

import java.util.EventObject

public class MyEvent extends EventObject

{

private Object obj

private String sName

public MyEvent(Object source,String sName)

{

super(source)

this.obj=source

this.sName=sName

}

public Object getObj()

{

return obj

}

public String getsName()

{

return sName

}

}

import java.util.EventListener

public interface MyEventListener extends EventListener

{

public void handleEvent (MyEvent me)

}

import java.util.Iterator

import java.util.Vector

import demo.DemoEvent

public class MyEventSource

{

private Vector list=new Vector()

private String sName = ""

public MyEventSource()

{

super()

}

public void addMyEventListener(MyEventListener me)

{

list.add(me)

}

public void deleteMyEventListener(MyEventListener me)

{

list.remove(me)

}

public void notifyMyEvent(MyEvent me)

{

Iterator it=list.iterator()

while(it.hasNext())

{

((MyEventListener) it.next()).handleEvent(me)

}

}

public void setName(String str)

{

boolean bool = false

if (str == null &&sName != null)

bool = true

else if (str != null &&sName == null)

bool = true

else if (!sName.equals(str))

bool = true

this.sName = str

// 如果改变则执行事件

if (bool)

notifyMyEvent(new MyEvent(this, sName))

}

public String getsName()

{

return sName

}

}

public class Test implements MyEventListener

{

public Test()

{

MyEventSource mes = new MyEventSource()

mes.addMyEventListener(this)

mes.setName("niu")

}

public static void main(String args[])

{

new Test()

}

public void handleEvent(MyEvent me)

{

System.out.println(me.getSource())

System.out.println(me.getsName())

}

}