首页 > 代码库 > 观察者设计模式
观察者设计模式
/**
* 事件接口即被观察者
*
* @author Host
*
*/
publicinterface Event {
void attach(Listener listener);
void detach(Listener listener);
void notifyListener();
}
/**
* 事件监听者观察者
*
* @author Host
*
*/
publicinterface Listener {
void execute();
}
事件源的一个实现类(磁盘事件)
publicclass DiskEvent implements Event {
private Set<Listener> listeners;
public DiskEvent() {
// TODO Auto-generated constructor stub
listeners = new HashSet<>();
}
@Override
publicvoid attach(Listener listener) {
// TODO Auto-generated method stub
listeners.add(listener);
}
@Override
publicvoid detach(Listener listener) {
// TODO Auto-generated method stub
if (listeners.contains(listener)) {
listeners.remove(listener);
System.out.println("观察者-->" + listener.toString()
+ "-已经不再监听我");
}
}
@Override
publicvoid notifyListener() {
// TODO Auto-generated method stub
System.out.println("日志:DIskEvent 正在通知观察者们!");
if (listeners.size() > 0) {
for (Listener listener : listeners) {
listener.execute();
}
}
System.out.println("日志:DIskEvent 的观察者们执行完毕!");
}
}
磁盘时间的两个观察者(磁盘观察者和系统观察者)
/**
* 磁盘观察者
* @author Host
*
*/
publicclass DiskListener implements Listener {
@Override
publicvoid execute() {
// TODO Auto-generated method stub
System.out.println("我是磁盘监听器,有人通知我磁盘发生了改变...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("我完成了任务,用时5秒。");
}
}
/**
* 系统观察者
* @author Host
*
*/
publicclass SystemListener implements Listener {
@Override
publicvoid execute() {
// TODO Auto-generated method stub
System.out.println("我是系统监听器(负责监视系统中所有事件),有人通知我磁盘发生了改变...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("我向注册表中写了内容,用时5秒。");
}
}
/**
* 测试设计模式是否正确运行
*
* @author Host
*
*/
publicclass ObserverDemo {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
System.out.println("测试观察者设计模式是否正确运行!");
System.out.println("--------------------开始--------------------");
// 创建观察者
Listener sysListener = new SystemListener();
Listener diskListener = new DiskListener();
// 休息6秒
sleep(6);
System.out.println("磁盘观察者和系统观察者初始化完毕。");
// 创建被观察者
Event diskEvent = new DiskEvent();
// 休息6秒
sleep(6);
System.out.println("磁盘事件源----------初始化完毕");
// 为被观察者添加观察者
diskEvent.attach(diskListener);
// 休息3秒
sleep(3);
System.out.println("磁盘事件源----------添加磁盘观察者成功!");
diskEvent.attach(sysListener);
// 休息5秒
sleep(5);
System.out.println("磁盘事件源----------添加系统观察者成功!");
// 唤醒观察者们
// 休息5秒
sleep(5);
System.out.println("磁盘事件源----------正在唤醒观察者们。。。");
// 休息5秒
sleep(5);
diskEvent.notifyListener();
// 删除系统观察者
diskEvent.detach(sysListener);
System.out.println("磁盘事件源----------删除系统观察者后。。。");
// 休息5秒
sleep(5);
// 删除系统观察者后再次唤醒观察者们。。。
diskEvent.notifyListener();
// 休息5秒
sleep(5);
System.out.println("--------------------结束--------------------");
// 休息5秒
sleep(5);
System.out.println("观察者设计模式正确运行!");
}
publicstaticvoid sleep(int time) {
int t = time * 1000;
try {
Thread.sleep(t);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试结果输出