您现在的位置是:首页 >

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

火烧 2023-04-17 09:10:49 1052
Java中使用观察者模式实现自定义事件   MyEve tTe t java:   ackage wi ty eve t   im ort javax wi g eve t Eve tLi te er

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

  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

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

  * @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

  

  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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码