美文网首页
day17 协议与代理 ---- iOS

day17 协议与代理 ---- iOS

作者: wwwying9 | 来源:发表于2016-03-19 19:46 被阅读137次

    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
    

    相关文章

      网友评论

          本文标题:day17 协议与代理 ---- iOS

          本文链接:https://www.haomeiwen.com/subject/kdbhlttx.html