`
iluoxuan
  • 浏览: 571097 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

事件监听模式

 
阅读更多

1: swt还是android 都有 点击一个按钮,注册监听,等事件监听的模式:

首先有个事件,然后有处理事件的监听。和观察者模式来说差别还是蛮大的

简单的实现:http://abruzzi.iteye.com/blog/266027

 

事件监听器模式(一个简单的例子)


在GUI程序设计中,在设计时通常不会知道用户的动作什么时候会发生,如用户可能点击某一
个按钮,也可能不点击,而且点击按钮的时机在运行时才可能知道。如果用传统的程序控制
方式,则很难做到准确的响应。通常这种情况或者类似的情况下,我们可以使用事件/监听器模式。

将一个监听器(listener)与特定的控件(如按钮等)绑定起来,当发生用户点击等事件(Event)时,
调用监听器的处理方法,从而响应用户的动作。是为事件/监听器模式。

事件有很多种,而且事件发生的时序是不确定的。可以简单的定义一个事件的接口,如下例:

Java代码   收藏代码
  1. interface Event{  
  2.     static int event1 = 0;  
  3.     static int event2 = 1;  
  4.     static int event3 = 2;  
  5.     ...  
  6.     int getEventType();  
  7. }  

 



一个监听器的接口的一种可能形式:

Java代码   收藏代码
  1. interface listener{  
  2.     void handleEvent(Event event);  
  3. }  

 



实现监听器接口的类可以根据事件的类型作出具体的响应方式如:可以开展给用户自己实现()

Java代码   收藏代码
  1. class ListenerImpl implements Listener{  
  2. some other methods of this implementation;  
  3. ...  
  4. void handleEvent(Event event){  
  5.     switch(event.getEventType()){  
  6.         case Event.event1:  
  7.             doSomething();  
  8.             break;  
  9.         case Event.event2:  
  10.             doSomethingElse();  
  11.             break;  
  12.         default:  
  13.             break;  
  14.     }  
  15. }  
  16.   
  17. GUIThread thread = new GUIThread();   // 一般不放到这里 在外面注册
  18. thread.setListener(this);//注册监听器  
  19. ...  
  20. }  

 


在GUI的主流程中,需要有一个Event的实现者,和一个发起事件的组件,如:

Java代码   收藏代码
  1. class EventImpl implements Event{  
  2.     private int type;  
  3.     public EnentImpl(int type){  
  4.         this.type = type;  
  5.     }  
  6. }  
  7.   
  8. class GUIThread{  
  9.     private Listener listener;  
  10.     public void setListener(Listener listener){  
  11.         this.listener = listener;  
  12.     }  
  13.      
  14.     public void execute(){  
  15.         if(this.listener != null){  
  16.             Event event = new EventImpl(type);//触发了某事件  
  17.             listener.handleEvent(event);  
  18.         }  
  19.     }  
  20. }  

 

当然,这个实现只是一个原理性的描述,应该可以很容易根据这个描述作出自己的实现。关于事件的处理以及事件类型的定义等可以完全根据自己的需求定制。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics