Java Listener 模式

每种语言都有自己回调的方法,java也不例外.

Java的回调是采用多态的方式来回调.比如:

 

1 interface MouseListener {
2 //当click方法被调用的时候代表被鼠标点击了.
3   void click();
4 }

 

 

 

上面是一个接口,里面只有一个方法.先就通过一个例子展示java是如果施展多态的力量了.

 

1 public class Model {
2
3 //初始化50个监听器
4   private MouseListener[] listeners = new MouseListener[50];
5 //用于记录当前listeners数组记录到了哪里
6   int index = 0;
7
8 public void addListener(MouseListener listener) {
9 //向这个model中注册一个监听器
10   listeners[index++] = listener;
11 }
12
13 public void clickModel() {
14 //调用注册进来所有的listener的click方法
15   for (int i = 0; i < index; i++) {
16 listeners[i].click();
17 }
18 }
19 //测试model
20   public static void main(String[] args) {
21 Model model = new Model();
22 //添加一个匿名内部类,里面实现了click方法.
23   model.addListener(new MouseListener() {
24
25 public void click() {
26 System.out.println("我被点击了");
27 }
28 });
29 //再添加一个内部类.
30   model.addListener(new MouseListener() {
31
32 public void click() {
33 System.out.println("我被点击了");
34 }
35 });
36
37 //下面给model一个点击
38   model.clickModel();
39 }
40 }
41
42
43  

 

 

 

以上是java的MVC框架下最精彩的一段代码.下面是model的工作例子:

 

1 //测试model
2   public static void main(String[] args) {
3 Model model = new Model();
4 //添加一个匿名内部类,里面实现了click方法.
5   model.addListener(new MouseListener() {
6
7 public void click() {
8 System.out.println("我被点击了");
9 }
10 });
11 //再添加一个内部类.
12 model.addListener(new MouseListener() {
13
14 public void click() {
15 System.out.println("我被点击了");
16 }
17 });
18
19 //下面给model一个点击,在实际的JDK源代码中,也是这样子去调用Model中的响应方法的.
20 model.clickModel();
21 }
22

 

 

 

我们可以看到,只点击一次model,却可以输出了2次"我被点击了"的信息.这也就是为什么你可以向JButton,JComboBox,JList,JTable等等里面添加任意多的各种listener.当然其中的奥秘仍需要各位读者自己慢慢琢磨.下面是源代码:

 

1 public class Model {
2
3 //初始化50个监听器
4 private MouseListener[] listeners = new MouseListener[50];
5 //用于记录当前listeners数组记录到了哪里
6 int index = 0;
7
8 public void addListener(MouseListener listener) {
9 //向这个model中注册一个监听器
10 listeners[index++] = listener;
11 }
12
13 public void clickModel() {
14 //调用注册进来所有的listener的click方法
15 for (int i = 0; i < index; i++) {
16 listeners[i].click();
17 }
18 }
19 //测试model
20 public static void main(String[] args) {
21 Model model = new Model();
22 //添加一个匿名内部类,里面实现了click方法.
23 model.addListener(new MouseListener() {
24
25 public void click() {
26 System.out.println("我被点击了");
27 }
28 });
29 //再添加一个内部类.
30 model.addListener(new MouseListener() {
31
32 public void click() {
33 System.out.println("我被点击了");
34 }
35 });
36
37 //下面给model一个点击
38 model.clickModel();
39 }
40 }
41
42 interface MouseListener {
43 //当click方法被调用的时候代表被鼠标点击了.
44 void click();
45 }
46

 

posted on 2010-04-17 22:23  steven0lisa  阅读(19053)  评论(0编辑  收藏  举报

导航