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

来源:互联网 发布:三次元绅士软件 编辑:程序博客网 时间:2024/05/28 15:23

------- 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=[babynew];

       baomu * bao=[baomunew];

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

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

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

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

        [bwanttoeat];

        

    

    }

   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=[superinit]) {

       _sleepzhi=100;

       _tilizhi=100;

    }

    return self;

}

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

    [_baomufeedBabyEat];

    _tilizhi+=10;

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

}

-(void)wangtosleep{

    [_baomutakeBabySleep];

    _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
原创粉丝点击