java的事件监听机制由三个对象组成:事件源,事件监听器,事件对象
1.event object:事件对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
3.event listener:具体的对监听的事件类,当它监听到event object产生的时候,它就调用相应的方法,进行处理。
上代码:
事件源:
#import <Foundation/Foundation.h>
#import "ListenerProtocol.h"
//事件源
@class Event,Listener;
@interface Persion : NSObject<ListenerProtocol>
@property (nonatomic, strong)NSString *name;
- (void)persion;
- (void)persion:(Event *)event;
- (void)registerListener:(Listener *)listener;
- (void)eat;
- (void)run;
@end
#import "Persion.h"
#import "Listener.h"
#import "Event.h"
@interface Persion()
@property (nonatomic, strong)Listener *listener;
@end
@implementation Persion
-(void)persion
{
}
- (void)eat
{
if (self.listener) {
Event *e =[Event new];
[e eventWithPersion:self];
[self.listener eat:e];
}
NSLog(@"执行eat");
}
- (void)run
{
if (self.listener) {
Event *e =[Event new];
[e eventWithPersion:self];
[self.listener run:e];
}
NSLog(@"执行run");
}
- (void)registerListener:(Listener *)listener
{
if (listener) {
self.listener = listener;
}
}
@end
事件对象
#import <Foundation/Foundation.h>
@class Persion;
@interface Event : NSObject
- (void)eventWithPersion:(Persion *)persion;
- (Persion *)getPersion;
@end
#import "Event.h"
#import "Persion.h"
@interface Event()
{
Persion *_persion;
}
@end
@implementation Event
- (void)eventWithPersion:(Persion *)persion
{
if (persion == nil) {
// NSException *e = [NSException exceptionWithName:@"meidong" reason:@"persion is nill, result in listener can't get persion" userInfo:nil];
// @throw e;
NSAssert(persion, @"persion is null");
return;
}
[self setPersion:persion];
}
- (void)setPersion:(Persion *)persion
{
if (_persion != persion) {
_persion = persion;
}
}
- (Persion *)getPersion
{
return _persion;
}
@end
监听器
#import <Foundation/Foundation.h>
#import "ListenerProtocol.h"
@interface Listener : NSObject<ListenerProtocol>
@end
#import "Listener.h"
#import "Event.h"
#import "Persion.h"
// 监听器需要自实现
@implementation Listener
- (void)run:(Event *)event
{
NSLog(@"监听到 run之行了 获取事件对象 %@",[event getPersion].name);
}
- (void)eat:(Event *)event
{
NSLog(@"监听到 eat之行了 获取事件对象 %@",[event getPersion].name);
}
@end
调用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Persion *p = [Persion new];
p.name = @"meidong";
[p registerListener:[Listener new]];
[p eat];
[p run];
}
结果:
2017-03-15 12:24:22.505 demo[1150:59971] 监听到 eat之行了 获取事件对象 meidong
2017-03-15 12:24:22.506 demo[1150:59971] 执行eat
2017-03-15 12:24:22.506 demo[1150:59971] 监听到 run之行了 获取事件对象 meidong
2017-03-15 12:24:22.507 demo[1150:59971] 执行run
这么设计的好处是,事件对象调用某个方法时,事件监听器能够获取事件对象。使用kvo/通知都是监听数据,使用这种方式则能够监听方法的执行。
参考文档:http://www.cnblogs.com/wucaifang/p/4589359.html 这边文档是java实现的。