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
最後更新:2017-04-02 06:51:55