观察者模式 java实现

xiaoxiao2024-04-18  22

题目:每隔两秒触发一个事件打印出当前时间。

package Task; import java.util.EventObject; //定义一个类似 C# EventArgs 的类用来传递事件状态信息。 //一般要求继承自 java.util.EventObject,且以 Event 结尾。 public class DisplayEvent extends EventObject{ public Timer source; //构造函数的参数传递产生事件的事件源 public DisplayEvent(Timer source){ super(source); this.source = source; } } package Task; import java.util.Date; import java.util.EventListener; //通过接口来定义事件响应函数原型,就像c# delegate定义了响应函数的“模板” //一般要求继承自 java.util.EventListener,且以 Listener 结尾。 public interface IDisplayListener extends EventListener{ void ShowTime(DisplayEvent e,Date date); } package Task; import java.util.Date; //事件侦听者,实现侦听者接口 public class DisplayListener implements IDisplayListener{ public void ShowTime(DisplayEvent e,Date date){ System.out.println(date); } } package Task; import java.util.Calendar; import java.util.Vector; //定义演示控件类,也就是事件源 public class Timer { //用一个java.util.Vector对象来存储所有的事件监听器对象。 private Vector clicks = new Vector(); //添加事件订阅。一般以 add( listener)方式拼写,并添加 synchronized 关键字。 public synchronized void add(IDisplayListener listener) { clicks.add(listener); } //移除事件订阅。一般以 remove( listener)方式拼写,并添加 synchronized 关键字。 public synchronized void remove(IDisplayListener listener) { clicks.remove(listener); } //触发事件。 protected void doClickEvent(){ Calendar calendar; while (true) { calendar = Calendar.getInstance(); //锁定,避免在触发期间有事件被订阅或移除。 synchronized (this) { //创建事件状态对象。 DisplayEvent ce = new DisplayEvent(this); //循环触发所有的事件订阅方法。 for (int i = 0; i < clicks.size(); i++) { IDisplayListener e = (IDisplayListener) clicks.get(i); e.ShowTime(ce, calendar.getTime()); } } try { //进程睡2秒 Thread.sleep(2000); } catch(Exception e) { System.out.println(e); } } } //模拟点击操作。 public void Click() { doClickEvent(); } } package Task; public class Program { /** * 观察者模式 java实现<br> * 每隔2秒触发一个事件<br> * 输出当前time<br> * author:ZhangC * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Timer timer = new Timer(); //实例化一个事件侦听者 DisplayListener displayListener = new DisplayListener(); //添加事件订阅。 timer.add(displayListener); //触发 timer.Click(); } }

 

转载请注明原文地址: https://www.6miu.com/read-5015078.html

最新回复(0)