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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义