模拟“事件监听器”(一)

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

}

 

 

 

 

 

 

猜你喜欢

转载自hbiao68.iteye.com/blog/1931204