java中的回调,监听器,观察者
回调:
函数回调接口:
public interface ICallBack { public void callBack(); default void defaultCallBack() { System.out.println("我是函数接口的默认函数"); } }
回调者以及测试
public class Caller { public void call(ICallBack callBack){ System.out.println("start..."); // callBack.callBack(); callBack.defaultCallBack(); System.out.println("end..."); } public static void main(String[] args) { Caller call = new Caller(); call.call(()->{ System.out.println("函数接口回调成功");//这里是对接口的实现 }); } }
根据调用callBack还是defaultCallBack来判断输出什么,这里输出我是函数接口的默认函数
事件监听器
设计事件源,事件监听器(相当于回调接口),事件对象
当事件源对象上发生操作时,它将会调用事件监听器的一个方法,并在调用该方法时传递事件对象过去
事件监听器实现类,通常是由开发人员编写,开发人员通过事件对象拿到事件源,从而对事件源上的操作进行处理
简单描述就是:
事件源注册监听器,把事件对象丢给监听器,监听器除了可以去执行事件对象中的方法还可以实现自己的方法。
监听器接口:
public interface EventListener extends java.util.EventListener { //事件处理 public void handleEvent(EventObject event); }
事件对象:
public class EventObject extends java.util.EventObject{ private static final long serialVersionUID = 1L; public EventObject(Object source){ super(source); } public void doEvent(){ System.out.println("通知一个事件源 source :"+ this.getSource()); } }
事件源:
public class EventSource { //监听器列表,监听器的注册则加入此列表 private Vector<EventListener> ListenerList = new Vector<EventListener>(); //注册监听器 public void addCloseListener(EventListener eventListener){ System.out.println("事件源关注closeWindows事件"); ListenerList.add(eventListener); } public void addOpenListener(EventListener eventListener){ System.out.println("事件源关注openWindows事件"); ListenerList.add(eventListener); } //撤销注册 public void removeListener(EventListener eventListener){ ListenerList.remove(eventListener); } //接受外部事件 public void notifyListenerEvents(EventObject event){ for(EventListener eventListener:ListenerList){ eventListener.handleEvent(event); } } public static void main(String[] args) { EventSource eventSource = new EventSource(); eventSource.addCloseListener((event)->{ event.doEvent(); if(event.getSource().equals("closeWindows")){ System.out.println("监听器监听到并执行doClose"); } else { System.out.println("监听器没有监听到closeWindows"); } }); eventSource.addOpenListener((event)->{ event.doEvent(); if(event.getSource().equals("openWindows")){ System.out.println("监听器监听到并执行doOpen"); } else { System.out.println("监听器没有监听到openWindows"); } }); eventSource.notifyListenerEvents(new EventObject("openWindows")); eventSource.notifyListenerEvents(new EventObject("closeWindows")); } }
执行结果:
每一个通知都会通知到每一个监听器
观察者:
观察者相当于事件监听器,
被观察者(Observable)相当于事件源和事件,执行事件源通知逻辑时,将会回调观察者的回调方法。
观察者:
public class WatcherDemo implements Observer { @Override public void update(Observable o, Object arg) { if(arg.toString().equals("openWindows")){ System.out.println("已经打开窗口"); } } public static void main(String[] args) { Watched watched = new Watched(); WatcherDemo watcherDemo = new WatcherDemo(); watched.addObserver(watcherDemo);//被观察者注册打开观察者 watched.addObserver((Observable o, Object arg)->{//被观察者注册关闭观察者,Observer接口 if(arg.toString().equals("closeWindows")){ System.out.println("已经关闭窗口"); } }); //触发打开窗口事件,通知观察者 watched.notifyObservers("openWindows"); //触发关闭窗口事件,通知观察者 watched.notifyObservers("closeWindows"); } }
被观察者:
public class Watched extends Observable { public void notifyObservers(Object arg) { /** * 为避免并发冲突,设置了changed标志位changed =true,则当前线程可以通知所有观察者,内部同步块会完了会设置为false; 通知过程中,正在新注册的和撤销的无法通知到。 */ super.setChanged(); super.notifyObservers(arg); } }
执行结果:
已经打开窗口
已经关闭窗口
参考:https://my.oschina.net/u/923324/blog/792857
- ServletContext对象的监听器
- HttpSession对象的监听器
- ServletRequest对象的监听器
这三个等待完成:
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/10847894.html