题目:每隔两秒触发一个事件打印出当前时间。
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();
}
}