课程名称:Java设计模式精讲 Debug方式+内存分析
课程章节: 观察者模式模式讲解+Coding+源码解析
主讲老师:Geely
课程内容:
问题1)观察者模式和监听者模式区别?
观察者模式中分两个角色:观察者和被观察者。
监听者模式中分3个角色:事件源,事件对象,监听器。
共同点:
- 其中事件源和事件对象组成了被观察者。
- 都是回调函数。注册到组件上,组件调用注册的对象上方法,这个方法就是回调函数。
- 都能广播。观察者模式可以单独
不同点:
- 角色不同。
- event-listener是传统的c/s界面事件模型,分事件源和事件(状态)角色,事件源要经过事件的包装、成为事件的属性之一再传递给事件监听/处理者,这个事件监听者就相当于观察者。
监听器模式是观察者模式的另一种形态,同样基于事件驱动模型。监听器模式更加灵活,可以对不同事件作出相应。但也是付出了系统的复杂性作为代价的,因为我们要为每一个事件源定制一个监听器以及事件,这会增加系统的负担。
问题2)监听者模式的成员?
监听者模式中分3个角色:事件源,事件对象,监听器。
事件源:就是一个实体对象。(静态)
事件对象;就是对事件源的操作。(动态)
监听器:根据事件源和事件对象判断是否是监听的动作,再做出处理。
问题3)监听者模式的调用过程?
事件源发布事件对象,给某个监听器,监听器根据事件类型和事件源,判断是否是自己要监听的。
事件源发布其实就是调用注册在它上面的监听器方法。
问题4)例子?
public class demo {
public static void main(String[] args) {
Event event = new Event();
eventSource eventSource = new eventSource();
doubleClickEventListener doubleClick = new doubleClickEventListener();
singleClickEventListener singleClick = new singleClickEventListener();
event.setType("singleClick"); // 事件类型,单击对象
eventSource.register(singleClick); // 注册单击事件
eventSource.publishEvent(event); // 发布事件
event.setType("doubleClick"); // 事件类型,双击对象
eventSource.register(doubleClick); // 注册双击事件
eventSource.publishEvent(event); // 发布事件
}
}
/** 监听器接口,一般监听器都是注册在事件源上 */
public interface eventListener {
// 传入事件
public void processEvent(Event event);
}
/** 事件监听器实现类 */
public class doubleClickEventListener implements eventListener{
@Override
public void processEvent(Event event) {
if (“doubleClick”.equals(event.getType())){
System.out.println(“双击事件。。。”);
}
}
}
/** 事件监听器实现类 */
public class singleClickEventListener implements eventListener{
@Override
public void processEvent(Event event) {
if ("singleClick".equals(event.getType())){
System.out.println("单击事件。。。");
}
}
}
public class eventSource {
// 存在多个监听器
private List listeners = new ArrayList<>();
// 注册监听器
public void register(eventListener listener){
listeners.add(listener);
}
// 根据不同的事件对象,调用对应监听器的方法,发布事件
public void publishEvent(Event event){
for (eventListener listener:listeners){
listener.processEvent(event);
}
}
}
/**
- 事件对象
*/
@Getter
@Setter
public class Event {
// 事件类型
private String type;
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章