day17 protocol
1. protocol的应用1
限定类型: 我们做某些事情都需要有一定的条件
例如: 找老婆
要求: 做饭\洗衣服
如果仅仅通过一个属性来保存老婆对象,
那么我们是不知道给我们的老婆,是否可以做饭/洗衣服
- main
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Wife.h"
int main(int argc, const char * argv[]) {
// 1.创建一个人
Person *p = [Person new];
// 2.创建一个老婆
Wife *w = [Wife new];
// 3.把老婆给这个人
p.wife = w;
[p show];
return 0;
}
- Preson.h
#import <Foundation/Foundation.h>
@class Wife;
@class Person;
/*
1.一般情况下, 协议不用单独定义一个文件, 哪个类需要用到这个协议
(哪个类需要限定其它类遵守某个协议), 那么协议就定义在哪个类中
A类要限定B类, 那么协议就写在A类中
2.协议的名称, 一般以限定这个协议的类名开头,
后面跟上Protocol或Delegate
如果是A类限定B类, 那么协议名称就以A类的类名开头,
后面跟上Protocol或Delegate
3.被限定的那个类中, 如果用到了协议,
头文件中应该使用@protocol, .m文件中使用#import
""导入协议
如果B类需要用到A类中定义的协议,
在.h文件中使用@protocol, .m文件中使用#import
4.如果A类用到了B类实现的协议中的方法,
使用之前为了保存程序安全,
必须先利用respondsToSelector方法判断是否可以调用
5.协议中的方法, 一般情况下至少有一个参数,
谁触发了这个协议, 就将谁传递出去
*/
//@protocol PersonProtocol <NSObject>
@protocol PersonDelegate <NSObject>
// 会做饭
- (void)cooking:(Person *)person;
// 会洗衣服
- (void)washing:(Person *)person;
@end
@interface Person : NSObject
@property (nonatomic, strong)Wife<PersonDelegate> *wife;
- (void)show;
@end
- Preson.m
#import "Person.h"
#import "Wife.h"
@implementation Person
- (void)show {
// 1.判断老婆对象是否真的可以做饭/洗衣服/好工作
if ([_wife respondsToSelector:@selector(cooking:)]) {
[_wife cooking: self];
}
if ([_wife respondsToSelector:@selector(washing:)]) {
[_wife washing: self];
}
}
@end
- wife.h
#import <Foundation/Foundation.h>
@protocol PersonDelegate;
@interface Wife : NSObject <PersonDelegate>
@end
- wife.m
// 会做饭
- (void)cooking:(Person *)person {
NSLog(@"%s", __func__);
}
// 会洗衣服
- (void)washing:(Person *)person {
NSLog(@"%s", __func__);
}
@end
protocol应用场景2---代理
代理设计模式
代理设计模式应用场景
-
a. 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
-
b. 当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
-
c. 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
应用举例:保姆代理
需求: 设计一个保姆代理来照顾婴儿吃饭睡觉
- main
#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nanny.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
//需求: 设计一个保姆代理来照顾婴儿吃饭睡觉
Baby *baby = [Baby new];
Nanny *nanny = [Nanny new];
baby.nanny = nanny;
// Student *stu = [Student new];
// baby.nanny = stu;
NSLog(@"----------");
[baby babyHungry:56];
NSLog(@"---------------------");
[baby babySleepy:56];
NSLog(@"----------");
return 0;
}
- Baby.h
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProtocol <NSObject>
-(void)sleep:(Baby *)baby;
-(void)food:(Baby *)baby;
@end
@interface Baby : NSObject
@property(nonatomic, strong)id<BabyProtocol> nanny;
@property(nonatomic, assign)int hungry;
@property(nonatomic, assign)int sleepy;
-(void)babyHungry:(int)hungry;
-(void)babySleepy:(int)sleepy;
@end
- Baby.m
#import "Baby.h"
@implementation Baby
-(void)babyHungry:(int)hungry{
self.hungry = hungry;
NSLog(@"宝宝饿了, 饥饿度 = %i", self.hungry);
while (self.hungry >= 15){
[self.nanny food:self];
}
NSLog(@"不饿了, 饥饿度 = %i", self.hungry);
}
-(void)babySleepy:(int)sleepy{
self.sleepy = sleepy;
NSLog(@"宝宝困了, 犯困度 = %i", self.sleepy);
while(self.sleepy <= 90){
[self.nanny sleep:self];
}
NSLog(@"睡觉了, 犯困度 = %i", self.sleepy);
}
@end
- Nanny.h
#import <Foundation/Foundation.h>
@protocol BabyProtocol;
@interface Nanny : NSObject <BabyProtocol>
@end
- Nanny.m
#import "Nanny.h"
#import "Baby.h"
@implementation Nanny
-(void)sleep:(Baby *)baby{
NSLog(@"唱歌, 犯困度 = %i", baby.sleepy += 10);
}
-(void)food:(Baby *)baby{
NSLog(@"喂饭, 饥饿度 = %i", baby.hungry -= 10);
}
@end
- Student.h
#import <Foundation/Foundation.h>
@protocol BabyProtocol;
@interface Student : NSObject <BabyProtocol>
@end
- Student.m
#import "Student.h"
#import "Baby.h"
@implementation Student
-(void)food:(Baby *)baby{
baby.hungry -= 10;
NSLog(@"喂食, 饥饿度 = %i", baby.hungry);
}
-(void)sleep:(Baby *)baby{
baby.sleepy += 10;
NSLog(@"唱歌, 犯困度 = %i", baby.sleepy);
}
@end
网友评论