观察者模式与监听器
---恢复内容开始---
今天学习了一下观察者模式者模式,于是用博客来记录这一次的学习,以后好复习。
什么是监听者模式:观察者模式定义一种一对多依赖关系,多个观察者观察一个对象。当被观察的对象状态发生改变时,或者触发了某个被观察对象的的某个时间,就会通知它的观察者;
该模式主要涉及到:抽象主题(abstract Subject)是被观察者的接口
具体主题(Subject)是具体被观察的对象
抽象观察者(abstract Observer)观察者的接口
具体观察者(Observer)观察者的具体实现
还可能会有抽象事件(abstract Event):事件的接口 具体事件(Event):事件的具体实现
下面有两个例子,一个是普通Java Project中的应用
被观察者接口:
public interface Watched {
public void addListener(Listener listener);
public void run();
}
观察者接口:
public interface Listener {
public void addEvent(Event event);
public String getContent();
}
事件接口:
public interface Event {
public String getContent();
public void setContent(String content);
}
被观察者具体实现:
public class IWatched implements Watched {
private Listener listener;
@Override
public void addListener(Listener listener) {
this.listener = listener;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
Event event = new IEvent();
event.setContent("运行了第" + i + "次");
listener.addEvent(event);
listener.getContent();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
监听者类的具体实现:
public class IListener implements Listener{
private Event event;
@Override
public void addEvent(Event event) {
this.event=event;
}
@Override
public void getContent() {
System.out.println(event.getContent());
}
}
事件类的具体实现:
public class IEvent implements Event{
private String content;
@Override
public String getContent() {
return content;
}
@Override
public void setContent(String content) {
this.content=content;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Listener listener = new IListener();
IWatched watched = new IWatched();
watched.addListener(listener);
watched.run();
}
}
在Web Project中运行实例:
被观察者接口:
public interface Event {
public String getContent();
public void setContent(String content);
}
观察者接口:
public interface Listener {
public void addEvent(Event event);
public String getContent();
}
事件接口:
public interface Event {
public String getContent();
public void setContent(String content);
}
被观察者具体实现类:
public class Process implements Watched {
private Listener listener;
public void addListener(Listener listener) {
this.listener = listener;
}
Event event = null;
public void run() {
for (int i = 0; i < 100; i++) {
event = new EventImpl();
event.setContent("第" + i + "运行");
listener.addEvent(event);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
监听器具体实现类:
public class ListenerImpl implements Listener {
private String content;
public void addEvent(Event event) {
this.content = event.getContent();
}
public String getContent() {
return content;
}
}
事件具体实现类:
public class EventImpl implements Event {
private String content = null;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
第一个测试servlet:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Listener listener = new ListenerImpl();
Process process = new Process();
process.addListener(listener);
request.getSession().setAttribute("listener", listener);
process.run();
}
第二个测试servlet:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Listener listener=(Listener) request.getSession().getAttribute("listener");
System.out.println(listener.getContent());
}
不断刷新浏览器页面,控制台打印出如下信息:
第12运行
第15运行
第17运行
第18运行
第18运行
第20运行
第21运行
第23运行
第27运行
第35运行
第50运行
---恢复内容结束---