java监听者模式代码 java监听按钮( 四 )


被观察者(Observable)相当于事件源和事件,执行事件源通知逻辑时,将会回调observer的回调方法update 。
举个例子
为了方便,同样我直接使用jdk自带的Observer 。
一个观察者
public class WatcherDemo implements Observer {
@Override
public void update(Observable o, Object arg) {
if(arg.toString().equals("openWindows")){
System.out.println("已经打开窗口");
}
}
}
被观察者
Observable 是jdk自带的被观察者,具体可以自行看源码和之前的监听器事件源类似 。
主要方法有
addObserver() 添加观察者,与监听器模式类似
notifyObservers() 通知所有观察者
类Watched.java的实现描述:被观察者,相当于事件监听的事件源和事件对象 。又理解为订阅的对象 主要职责:注册/撤销观察者(监听器),接收主题对象(事件对象)传递给观察者(监听器),具体由感兴趣的观察者(监听器)执行
/**
}
测试执行
public static void main(String[] args) {
Watched watched = new Watched();
WatcherDemo watcherDemo = new WatcherDemo();
watched.addObserver(watcherDemo);
watched.addObserver(new Observer(){
@Override
public void update(Observable o, Object arg) {
if(arg.toString().equals("closeWindows")){
System.out.println("已经关闭窗口");
}
}
});
//触发打开窗口事件,通知观察者
watched.notifyObservers("openWindows");
//触发关闭窗口事件 , 通知观察者
watched.notifyObservers("closeWindows");
控制台输出:
已经打开窗口
已经关闭窗口
总结
从整个实现和调用过程来看,观察者和监听器模式基本一样 。
有兴趣的你可以基于这个模型,实现一个简单微博加关注和取消的功能 。说到底,就是事件驱动模型,将调用者和被调用者通过一个链表、回调函数来解耦掉,相互独立 。
“你别来找我 , 有了我会找你” 。
整个设计模式的初衷也就是要做到低耦合,低依赖 。
再延伸下,消息中间件是什么一个模型? 将生产者+服务中心(事件源)和消费者(监听器)通过消息队列解耦掉. 消息这相当于具体的事件对象,只是存储在一个队列里(有消峰填谷的作用),服务中心回调消费者接口通过拉或取的模型响应 。想必基于这个模型 , 实现一个简单的消息中间件也是可以的 。
还比如gava ListenableFuture,采用监听器模式就解决了future.get()一直阻塞等待返回结果的问题 。
有兴趣的同学,可以再思考下观察者和责任链之间的关系,我是这样看的 。
同样会存在一个链表,被观察者会通知所有观察者,观察者自行处理,观察者之间互不影响 。而责任链,讲究的是击鼓传花,也就是每一个节点只需记录继任节点,由当前节点决定是否往下传 。常用于工作流,过滤器web filter 。
关于java监听者模式代码和java监听按钮的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读