在网上搜索了很多关于事件驱动的,大部分都是介绍如何利用awt包里面的控件,然而自己却是想要了解这个是怎么设计的,因此模拟了一个简单的demo,提供自己学习
在讲解事件驱动模型之前,我们现在看看事件驱动模型的三大要素:
事件源:能够接收外部事件的源体。
侦听器:能够接收事件源通知的对象。
事件处理程序:用于处理事件的对象。
先提供一个JAVA基于awt的事件处理
package hb.client;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SimpleEventDemo extends JFrame {
public SimpleEventDemo() {
JButton jbtOK = new JButton("OK");
setLayout(new FlowLayout());
add(jbtOK);
ActionListener listener = new OKListener();
jbtOK.addActionListener(listener);
}
/** Main method */
public static void main(String[] args) {
JFrame frame = new SimpleEventDemo();
frame.setTitle("SimpleEventDemo");
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 80);
frame.setVisible(true);
}
}
class OKListener implements ActionListener {
//acObj是用户在点击按钮的时候创建的,然后传递给Listener
public void actionPerformed(ActionEvent acObj) {
System.out.println(acObj.getActionCommand());
System.out.println(acObj.getActionCommand());
}
}
自己写的一个驱动模型图:
1、新建一个监听器接口
public interface Listener {
public void action(Object obj);
}
2、实现监听器接口
public class SayListener implements Listener {
@Override
public void action(Object obj) {
System.out.println(obj.toString());
}
}
public class RunListener implements Listener {
@Override
public void action(Object obj) {
System.out.println(obj.toString());
}
}
3、创建一个事件源(这里是模拟人)
package hb.client;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class UserSource {
//添加的监听器对象
List<Listener> listener = new LinkedList<Listener>();
public void addListener(Listener listener){
this.listener.add(listener);
}
public List<Listener> getListener() {
return listener;
}
public void setListener(List<Listener> listener) {
this.listener = listener;
}
//根据不同的监听器对象执行不同的方法
public void action(Object obj){
Iterator it = listener.iterator();
while(it.hasNext()){
Listener listener = (Listener)it.next();
//是“say监听器”
if(listener instanceof SayListener){
System.out.println("执行say方法事件");
((SayListener)listener).action(obj);
}
//是"run监听器"
if(listener instanceof RunListener){
System.out.println("执行run方法事件");
((RunListener)listener).action(obj);
}
}
}
public void say(){
String str = "我是触发say事件产生的对象";
action(str);
}
public void run(){
String str = "我是触发run事件产生的对象";
action(str);
}
}
4、模拟客户端触发事件
public class EventTestDemo {
public static void main(String[] args) {
SayListener listener = new SayListener();
UserSource user = new UserSource();
//添加事件对象,如果不添加则不会触发事件的action方法
user.addListener(listener);
user.say();
}
}