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
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值