OC中请一点要面对抽象,不要面对具体。
delegate代理模式使用场景:(其实是一种设计程序的模式或者想法,通过协议完成一种多态的特性,让代码更加抽象)
1、当A类对象发生什么事想通知B类型对象 (B类对象成为A类对象的代理)
2、A类中有些事情,自己无法处理,需要B类对象帮助其处理 (B类对象成为A类对象的代理)
3、B类对象向知道A类对象中发生的事情 (B类对象成为A类对象的代理)
老板 与 司机
老板要去某地购物,需要通知司机 (司机就是老板的代理)
老板想开车,但是驾照没考出,需要司机帮忙 (司机就是老板的代理)
司机想知道老板什么时候要出去(司机就是老板的代理)
步骤
1、A类对象发生事情向要给外边发一个通知来让其他类的实例对象帮做事情
2、在A类中定义协议 Adelegate,协议中写希望其他的实例对象帮做事情
3、在A类中定义一个属性 id<Adelegate> delegate
4、当A类对象发生事情就去通知它的代理来做事情,这个时候需要判断它的代理是否真的有能力帮它来做
5、B类型对象想成为A类对象代理的类,就要要遵守ADelegate的协议
6、实现自己想要监听的方法
7、让B类对象成为A类对象的代理
#import <Foundation/Foundation.h>//------main
#import "LSStudent.h"
#import "LSManager.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
LSBoss *boss = [[LSBoss alloc] init]; //创建老板
LSStudent *stu = [[LSStudent alloc] init];//创建学生
boss.delegate = stu;//老板的代理是学生
boss.money = 10000;
[boss wantToGoToShoping];//这里就是学生去开车
LSManager *manager = [[LSManager alloc] init];
boss.delegate = manager; //这里把司机换成了经理
[boss wantToGoToShoping];
}
return 0;
}
#import <Foundation/Foundation.h>//------LSBoss.h
@class LSBoss; //让编译器知道有这个类
@protocol LSBossDelegate <NSObject> //定义一个代理的协议
- (void) driveToShop:(LSBoss *) boss; //协议中需要去实现的方法,开车带老板去商店买东西
@end
@interface LSBoss : NSObject
@property(nonatomic,strong)id<LSBossDelegate> delegate; //老板的司机代理
@property(nonatomic,assign)double money; //老板的钱
-(void) wantToGoToShoping; //想去购物的方法
@end
#import "LSBoss.h"//------LSBoss.m
@implementation LSBoss
-(void) wantToGoToShoping{
//判断一下,代理是否有能力开车
if ([self.delegate respondsToSelector:@selector(driveToShop:)]) {
[self.delegate driveToShop:self];
}else{
NSLog(@"让隔壁老王来");
}
}
@end
#import <Foundation/Foundation.h>//------LSStudent.h 创建一个学生,遵守协议
#import "LSBoss.h"
@interface LSStudent : NSObject <LSBossDelegate>
@end
#import "LSStudent.h"//------LSStudent.m
@implementation LSStudent
- (void) driveToShop:(LSBoss *) boss{
boss.money -= 100;
NSLog(@"%s,money = %.2lf",__func__,boss.money);
}
@end
#import <Foundation/Foundation.h>//------LSManager.h 创建一个经理遵守协议
#import "LSBoss.h"
@interface LSManager : NSObject <LSBossDelegate>
@end
#import "LSManager.h"//------LSManager.m
@implementation LSManager
- (void) driveToShop:(LSBoss *) boss{
boss.money -= 500;
NSLog(@"%s,money = %.2lf",__func__,boss.money);
}
@end