java基本事件处理机制解析
基本事件处理机制分析
一、什么是事件处理机制?
事件处理机制中参与有三种角色:事件源、事件、事件监听者
- 事件源:产生事件的对象/组件
- 事件:事件源的状态发生改变之后的对象,如鼠标操作、键盘操作等
- 事件监听者:负责监听事件的发生并处理事件
二、Action与ActionListener机制分析
Java GUI可以利用ActionListener进行ActionEvent的监听
其步骤如下:
- 事件监听者实现了接口ActionListener的类实例
- 事件源对象能够添加监听器对象并向其发送事件对象
- 当事件发生时,事件源将事件对象发送给添加的监听器
- 监听器对象对事件对象进行处理响应
示例:
//actionlistener可以作为外部类、内部类、匿名类进行监听,本示例使用内部类 //两个监听者对应两个button组件 private class bt1Handler implements ActionListener { public void actionPerformed(ActionEvent e) { jTextArea.setText("按钮一点击"); } } private class bt2Handler implements ActionListener { public void actionPerformed(ActionEvent e) { jTextArea.setText("按钮二点击"); } } //添加监视器 bt1.addActionListener(bt1Handler); bt2.addActionListener(bt2Handler);
效果:
三、其他事件处理方式
(1)普通方法调用
它是一种阻塞式调用,例如A类中的方法a要调用B类中的方法b,必须要等待b方法执行完毕才能执行b方法之后的代码,如果b方法执行时间较长,整个过程就被阻塞在了这一步。
(2)回调函数
回调函数的概念十分简单,就是将函数作为另一个函数的参数,java中不允许方法作为参数们只能传入类,然后调用类的方法,分为同步与异步回调函数,下面分别实现:
同步回调:
//示例:我与朋友打电话让他去我家吃饭,朋友同意 //Me类: public class Me implements callable { MyFriend friend; public Me( MyFriend friend){ this.friend=friend; } public void callFriend() throws Exception { System.out.println("开始执行同步回调函数"); System.out.println("去我家吃饭"); friend.answer(this); System.out.println("开始执行同步回调函数"); } @Override //回调函数 public void call(){ System.out.println("好好好"); } } //MyFriend类: public class MyFriend { public void answer( callable callable) throws Exception{ System.out.println("接线中....."); callable.call(); } } //callable接口: public interface callable { public void call(); } //test类: public class testCallBack { public static void main(String[] args) throws Exception{ MyFriend friend=new MyFriend(); Me me=new Me(friend); me.callFriend(); } }
结果:
异步回调:
//与同步回调区别是,回调函数单开一个线程,不影响和Me类等待回调函数执行完成 public void callFriend() throws Exception { System.out.println("开始执行异步回调函数"); new Thread(new Runnable() { @Override public void run() { try { System.out.println("去我家吃饭"); friend.answer(Me.this); } catch (Exception e) { e.printStackTrace(); } } }).start(); System.out.println("异步回调函数执行完成"); }
结果:
(3)观察者模式
所谓观察者模式,其实是一种一对多的模式,有一个被观察者以及多个观察者,当被观察者的状态发生变化时,观察者可以收到相应的信息。像我们平时订阅一个微信公众号或者是b站上关注一个up主,当其发布新内容时,你就会得知相应的信息。
示例:
//你关注的up主更新了,并私信通知他的所有粉丝 //观察者接口 public interface Observer { public void update(String video); } //具体观察者(粉丝)类 public class Fan implements Observer{ private String name;//粉丝姓名 public Fan(String name){ this.name=name; } @Override public void update(String video){ System.out.println(name+"! "+video); } } //被观察者接口 public interface UpLoader { //添加粉丝 void addFan(Fan fan); //删除粉丝 void deleteFan(Fan fan); //通知粉丝 void informFan(String video); } //实现类 public class BilibliUpLoader implements UpLoader{ public String getName() { return name; } private String name; private List<Fan> fanList=new ArrayList<>(); public BilibliUpLoader(String name){ this.name=name; } @Override public void addFan(Fan fan) { fanList.add(fan); } @Override public void deleteFan(Fan fan) { fanList.remove(fan); } @Override public void informFan(String video) { for(Fan fan:fanList){ fan.update(video); } } } //测试类 public class test { public static void main(String[] args) { BilibliUpLoader bilibliUpLoader=new BilibliUpLoader("Mike"); Fan fan=new Fan("jack"); Fan fan1=new Fan("Bob"); Fan fan2=new Fan("Mary"); Fan fan3=new Fan("Lisa"); bilibliUpLoader.addFan(fan); bilibliUpLoader.addFan(fan1); bilibliUpLoader.addFan(fan2); bilibliUpLoader.addFan(fan3); bilibliUpLoader.informFan(bilibliUpLoader.getName()+"的新视频来了"); } }
结果:
(4)几种事件处理机制综合比较
以上四种事件处理机制中可以分为两类,普通方法调用为一类,其他三种为第二类:
抽象与解耦:
这三种事件处理方式利用接口将抽象类与实现类的耦合度降低,同时将接口充当调用者与被调用者之间的第三者,通过接口尽可能减少不同类的依赖关系,尽可能增大数据耦合,从而降低耦合程度。
高内聚:
后三钟事件处理方式,将不同主体分开来(如观察者与被观察者),每个实体类专注于自身的职责(即单一原则)。
好处:
“高内聚,低耦合”使得后面三种事件处理方式易于扩展、灵活性高、更易于维护与开发,而普通的函数调用则不具备这些优点。这也是面向接口编程的一大特点。
到此这篇关于java基本事件处理机制解析的文章就介绍到这了,更多相关java事件处理机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号"
这篇文章主要介绍了IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号" ,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08详解spring+springmvc+mybatis整合注解
本篇文章主要介绍了详解spring+springmvc+mybatis整合注解,详细的介绍了ssm框架的使用,具有一定的参考价值,有兴趣的可以了解一下2017-04-04@Transaction,@Async在同一个类中注解失效的原因分析及解决
这篇文章主要介绍了@Transaction,@Async在同一个类中注解失效的原因分析及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12java中MultipartFile类型转为File类型的4种方法
Spring提供了一个MultipartFile接口来处理文件上传,但有时候我们需要将MultipartFile转换为File来进行一些特定的操作,比如保存文件到本地或者进行文件的处理等,这篇文章主要给大家介绍了关于java中MultipartFile类型转为File类型的4种方法,需要的朋友可以参考下2024-09-09Java面试常考之ConcurrentHashMap多线程扩容机制详解
几乎所有的后端技术面试官都要在 ConcurrentHashMap 技术的使用和原理方面对小伙伴们进行刁难,本文主要来和大家聊聊ConcurrentHashMap多线程的扩容机制,希望对大家有所帮助2023-05-05
最新评论