用OC实现一个类似java的事件监听机制

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实现的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值