黑马程序员 oc随记 协议与代理模式

------- android培训java培训ios培训、期待与您交流! ----------

一.协议(protocol)

协议的定义

@protocol 协议名称

//方法声明列表

@end;​

在默认的情况下,只要是协议里声明过的方法,遵守此协议的类 就必须要要实现协议里声明的所有的方法,​否则系统就会发出警告。一个类可以同时遵守多个协议,而在OC中类的继承只能是单一继承。 前面说道在默认的情况下需要类要实现协议里的全部方法,OC中提供了两个关键字 @required和@optional

二.代理模式

严格来说,代理模式并不是一种特殊的代码,而是由协议引申而来的一种设计模式,例:由一个婴儿,她本身不会自己照顾自己吃饭睡觉,需要有人喂食有人哄她睡觉,此时,她的父母为了满足婴儿的需求请了一个保姆,保姆与婴儿之中存在协议,协议需要一个会照顾小孩吃饭睡觉的保姆,若不符合,婴儿的父母就会将她辞退,这时,符合协议内容的保姆便是婴儿的代理人。

由此,结合协议与代理模式写一串代码:

#import <Foundation/Foundation.h>

#import "baby.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        baby * b=[baby new];

        baomu * bao=[baomu new];

        b.baomu=bao;  //定义一个保姆与保姆并使保姆成为这个婴儿的代理人,注意,当保姆不符合协议时会发出黄色警告。

        NSLog(@"睡眠值:%d",b.sleepzhi);

        NSLog(@"体力值:%d",b.tilizhi);

        [b wangtosleep];  //当婴儿需要吃饭睡觉时,便由保姆执行另一段方法。

        [b wanttoeat];

        

    

    }

    return 0;

}


#import <Foundation/Foundation.h>


@protocol take_care_about_the_baby <NSObject//这就是协议,其中规定了保姆类需要有喂食和哄小孩睡觉两个方法,一旦保姆类不存在着两个方法便会报错

-(void)feedBabyEat;

-(void)takeBabySleep;

@end


#import <Foundation/Foundation.h>

#import "baomu.h"

@interface baby : NSObject

@property (nonatomic,strong) baomu *baomu;

@property(nonatomic,assign) int tilizhi;

@property(nonatomic,assign) int sleepzhi;

-(void)wanttoeat;

-(void)wangtosleep;

@end


#import "baby.h"


@implementation baby

-(instancetype)init{

    if (self=[super init]) {

        _sleepzhi=100;

        _tilizhi=100;

    }

    return self;

}

-(void)wanttoeat{  //宝宝的两个方法,当需要吃饭睡觉时,让保姆执行相应的方法

    [_baomu feedBabyEat];

    _tilizhi+=10;

    NSLog(@"体力值:%d",_tilizhi);

}

-(void)wangtosleep{

    [_baomu takeBabySleep];

    _sleepzhi+=10;

    NSLog(@"睡眠值:%d",_sleepzhi);

}


@end


#import <Foundation/Foundation.h>

#import "take care about the baby.h"

@interface baomu : NSObject <take_care_about_the_baby//将协议写入.h文件中,注意,协议中拥有的方法不需要类进行再次声明便可使用,但默认情况下必须使用,除非使用@optional使得方法可选

@end

#import "baomu.h"


@implementation baomu

-(void)feedBabyEat{

    NSLog(@"宝宝饿了,保姆喂他喝了点奶水");

}

-(void)takeBabySleep{

    NSLog(@"宝宝累了,保姆哄他睡觉");

}

@end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值