在网上搜索了很多关于事件驱动的,大部分都是介绍如何利用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(); } }