天天看點

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.當然其中的奧秘仍需要各位讀者自己慢慢琢磨.下面是源代碼:

 4     private mouselistener[] listeners = new mouselistener[50];

 6     int index = 0;

10         listeners[index++] = listener;

15         for (int i = 0; i < index; i++) {

20     public static void main(string[] args) {

23         model.addlistener(new mouselistener() {

30         model.addlistener(new mouselistener() {

38         model.clickmodel();

42 interface mouselistener {

43     //當click方法被調用的時候代表被滑鼠點選了.

44     void click();

45 }

46