JAVA事件响应机制 1,先自定义一个事件 public class MyEvent extends java.util.EventObject{ public MyEvent(Object source) { super(source); } } 2,再自定义一个监听器 public class MyListener implements java.util.EventListener{ //这里是当事件发生后的响应过程 public void EventActivated(MyEvent me) { System.out.println("事件已经被触发"); } } 3,以下这个类为触发事件的事件源 public class MyObject { private Vector vectorListeners=new Vector(); public synchronized void addMyListener(MyListener ml) { vectorListeners.addElement(ml); } public synchronized void removeMyListener(MyListener ml) { vectorListeners.removeElement(ml); } protected void activateMyEvent() { Vector tempVector=null; MyEvent e=new MyEvent(this); synchronized(this) { tempVector=(Vector)vectorListeners.clone(); for(int i=0;i<tempVector.size();i++) { MyListener ml=(MyListener)tempVector.elementAt(i); ml.EventActivated(e); } } } //定义一个公用方法用于触发事件 public void test() { activateMyEvent(); } } 4,测试类 public class Test { public static void main(String[] args) { MyObject mo=new MyObject(); //注册该事件 mo.addMyListener(new MyListener()); //触发该事件 mo.test(); } }
观察者模式-Java自定义事件
import java.util.EventObject;/*** Title: 事件处理类,继承了事件基类* Description:* Copyright: Copyright (c) 2005 Company:* cuijiang** @author not attributable* @version 1.0*/public class DemoEvent extends EventObject {private Object obj;private String sName;public DemoEvent(Object source, String sName) {super(source);obj = source;this.sName = sName;}public Object getSource() {return obj;}public void say() {System.out.println("这个是 say 方法...");}public String getName() {return sName;}}
package com.te.event.other;import java.util.EventListener;/*** Title: 监听器接口* Description:* Copyright: Copyright (c) 2005* Company: cuijiang* @author not attributable* @version 1.0*/public interface DemoListener extends EventListener{public void demoEvent(DemoEvent dm);}
package com.te.event.other;import java.util. * ;/*** Title: 使用事件的类* Description: 该类实现了监听器的添加和监听器方法的执行,并且实现了由于属性的改变而执行事件* Description: 在添加、删除、执行监听器的时候都要注意同步问题* Copyright: Copyright (c) 2005* Company: cuijiang* @author not attributable* @version 1.0*/public class DemoSource {private Vector repository = new Vector();private DemoListener dl;private String sName = "" ;public DemoSource() {}// 注册监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题public void addDemoListener(DemoListener dl) {repository.addElement(dl); // 这步要注意同步问题}// 如果这里没有使用Vector而是使用ArrayList那么要注意同步问题public void notifyDemoEvent(DemoEvent event) {Enumeration enu = repository.elements(); // 这步要注意同步问题while (enu.hasMoreElements()) {dl = (DemoListener) enu.nextElement();dl.demoEvent(event);}}// 删除监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题public void removeDemoListener(DemoListener dl) {repository.remove(dl); // 这步要注意同步问题}/*** 设置属性* @param str1 String*/public void setName(String str1) {boolean bool = false;if (str1 == null && sName != null)bool = true;else if (str1 != null && sName == null)bool = true;else if (!sName.equals(str1))bool = true;this .sName = str1;// 如果改变则执行事件if (bool)notifyDemoEvent( new DemoEvent( this, sName));}public String getName() {return sName;}}
package com.te.event.other;import java.lang.Thread;/*** Title: 测试类* Description: 测试了由于改变属性而引起的事件发生* Copyright: Copyright (c) 2005* Company: cuijiang* @author not attributable* @version 1.0*/public class TestDemoimplements DemoListener {private DemoSource ds;public TestDemo(){ds= new DemoSource();ds.addDemoListener( this);System.out.println("添加监听器完毕");try {Thread.sleep(3000);// 改变属性,触发事件ds.setName("改变属性,触发事件");}catch (InterruptedException ex) {ex.printStackTrace();}ds.addDemoListener( this );System.out.println("添加监听器完毕2");try {Thread.sleep(3000);// 改变属性,触发事件ds.setName("改变属性,触发事件2");}catch (InterruptedException ex) {ex.printStackTrace();}ds.removeDemoListener( this );System.out.println("添加监听器完毕3");try {Thread.sleep(3000);// 改变属性,触发事件ds.setName("改变属性,触发事件3");}catch (InterruptedException ex) {ex.printStackTrace();}}public static void main(String args[]){new TestDemo();}/*** demoEvent** @param dm DemoEvent* @todo Implement this test.DemoListener method*/public void demoEvent(DemoEvent dm) {System.out.println("事件处理方法");System.out.println(dm.getName());dm.say();}}