这里需要首先理解监听模式(观察者模式)和委托模式的区别,个人觉得两种模式绝大部分理念或者实现机制相同,所以这里暂且不做区分,只是OC里偏重与委托这个词,而Java中更习惯监听。
Button.m
实验内容:多个
Button
共用一个监听器对象
1 、创建协议 ButtonDelegate ,注意 onClick 方法的参数是一个 Button 对象,也就是事件源对象
@class Button;
@protocol ButtonDelegate <NSObject>
-(void)onClick:(Button *) btn;
@end
2 、创建 Button 类,
添加两个属性 _ID 、 _delegate 及其 getter 和 setter
添加构造方法 initWithID:(int)newID
添加方法 Button 点击触发方法 click
3 、创建 Button 的监听器类, MyButtonDelegate ,实现协议 ButtonDelegate ,覆盖 onClick :方法
注意此时 “onClick:” 为空方法
4 、在 main 中添加测试代码
a 、创建四个 Button 对象, btn1 、 btn2 、 btn3 、 btn4 并且分别设置其 “_ID” 属性为 1 、 2 、 3 、 4
b 、创建监听器对象,并且将其依次设置给四个 Button 对象
c 、修改监听器类方法 onClick :
利用 switch 辨别事件源,并且执行不同的操作
switch(btn.ID){
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
1 、创建协议 ButtonDelegate ,注意 onClick 方法的参数是一个 Button 对象,也就是事件源对象
@class Button;
@protocol ButtonDelegate <NSObject>
-(void)onClick:(Button *) btn;
@end
2 、创建 Button 类,
添加两个属性 _ID 、 _delegate 及其 getter 和 setter
添加构造方法 initWithID:(int)newID
添加方法 Button 点击触发方法 click
3 、创建 Button 的监听器类, MyButtonDelegate ,实现协议 ButtonDelegate ,覆盖 onClick :方法
注意此时 “onClick:” 为空方法
4 、在 main 中添加测试代码
a 、创建四个 Button 对象, btn1 、 btn2 、 btn3 、 btn4 并且分别设置其 “_ID” 属性为 1 、 2 、 3 、 4
b 、创建监听器对象,并且将其依次设置给四个 Button 对象
c 、修改监听器类方法 onClick :
利用 switch 辨别事件源,并且执行不同的操作
switch(btn.ID){
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
代码如下:
ButtonDelegate.h: 协议类(其实就是Java中的监听器接口)
#import <Foundation/Foundation.h> @class MyButton; //一般定义协议最好实现NSObject协议 //Cocoa有多个根类,除了NSObject还有NSProxy等其他等级的根类。这只是部分原因,NSObject协议定义了一套所有的根类都可以实现的基础方法,这样在编码时就容易找到了。 @protocol ButtonDelegate <NSObject]] > -(void)onClick:(MyButton *) btn; @end |
Button类:
Button.h
#import <Foundation/Foundation.h> //这里和@class类似,只需要声明ButtonDelegate是一个协议即可,无需关心其成员等细节 @protocol ButtonDelegate; //定义了一个按钮类,里面要有一个委托对象成员,也就是实现了委托协议的对象成员 @interface MyButton : NSObject //声明原子操作,且使用计数器处理内存 @property(nonatomic,retain) id<ButtonDelegate> delegate; @property int ID;//注意要大写 -(id)initWithID:(int)ID; -(void)click; @end |
#import "MyButton.h" #import "ButtonDelegate.h" @implementation MyButton -(id)initWithID:(int)ID{ if (self = [super init]) { _ID = ID; } return self; } -(void)click{ // 调用前使用selector检查是否存在这个方法 if ([_delegate respondsToSelector:@selector(onClick:)]) { [_delegate onClick:self]; }else{ NSLog(@"没有这个方法!!"); } } @end |
MyButtonDelegate:委托实现类(其实就是监听器实现类)
MyButtonDelegate.h
#import <Foundation/Foundation.h> #import "ButtonDelegate.h" // //@protocol ButtonDelegate; //这里不能用@protocol声明 //委托对象实现类,实现了委托协议ButtonDelegate,并且覆盖onClick:方法 @interface MyButtonDelegate : NSObject <ButtonDelegate]] > @end |
MyButtonDelegate.m
#import "MyButtonDelegate.h" #import "MyButton.h" @implementation MyButtonDelegate //覆盖实现协议中的方法,为按钮被点击时实际被调用的方法 -(void)onClick:(MyButton *)btn{ switch ([btn ID]) { case 0: NSLog(@"ID为1的那个按钮被点击了!"); break; case 1: NSLog(@"ID为2的那个按钮被点击了"); break; case 2: NSLog(@"ID为3的那个按钮被点击了"); break; default: break; } } |
main.m: 测试代码
#import <Foundation/Foundation.h> #import "MyButton.h" #import "MyButtonDelegate.h" int main(int argc, const char * argv[]) { @autoreleasepool { MyButton *btn0 = [[MyButton alloc]initWithID:0]; MyButton *btn1 = [[MyButton alloc]initWithID:1]; MyButton *btn2 = [[MyButton alloc]initWithID:2]; MyButtonDelegate *delegate = [[MyButtonDelegate alloc]init]; btn0.delegate = delegate; btn1.delegate = delegate; btn2.delegate = delegate; [btn0 click]; [btn1 click]; [btn2 click]; } return 0; } |