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

实现一个完整的科学计算,可以分为以下几个步骤: 1. 创建 UI 界面 创建一个 ViewController,在界面上添加一个 UILabel 用于显示计算结果,以及多个 UIButton 用于输入数字和运算符等。可以使用 Interface Builder 或代码实现。 2. 实现计算逻辑 在 ViewController 中实现计算逻辑,可以使用 NSExpression 类来进行数学表达式的计算。在输入数字和运算符时,将其添加到一个字符串中,然后调用 NSExpression 的 evaluateWithObject: 方法进行计算,并将结果显示在 UILabel 中。 3. 实现高级计算功能 实现高级计算功能,如三角函数、对数函数、指数函数、幂函数、开方函数、阶乘等运算。可以使用 math.h 中的函数或自己实现。 4. 实现进制转换和单位换算 实现进制转换和单位换算等功能,可以使用自己实现的算法或第三方库。 5. 添加其他功能 添加其他功能,如历史记录、撤销、重做、剪切、复制、粘贴等。可以使用 NSUndoManager 来实现撤销和重做功能。 下面是一个简单的示例代码,可以作为参考: ``` @interface ViewController () @property (nonatomic, strong) IBOutlet UILabel *resultLabel; @property (nonatomic, strong) NSMutableString *expression; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.expression = [NSMutableString string]; } - (IBAction)digitPressed:(UIButton *)sender { NSString *digit = sender.titleLabel.text; [self.expression appendString:digit]; self.resultLabel.text = self.expression; } - (IBAction)operatorPressed:(UIButton *)sender { NSString *operator = sender.titleLabel.text; [self.expression appendString:operator]; self.resultLabel.text = self.expression; } - (IBAction)equalsPressed:(id)sender { NSExpression *expression = [NSExpression expressionWithFormat:self.expression]; id result = [expression expressionValueWithObject:nil context:nil]; self.resultLabel.text = [result description]; } @end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值