设计模式之Protocol实现代理模式

  • 使用场合
  • 使用步骤
  • 不使用protocol实现代理
  • 使用protocol实现代理

一、使用场合

  1. A想让B帮忙,就让B代理
  2. A想通知B发生了一些事情,或者传一些数据给B
  3. 观察者模式

二、使用步骤

  1. 定义一份协议
  2. B遵循协议,并且实现相应的方法
  3. A中定义一个代理属性:id <协议> delegate
  4. 创建B对象,将其附值给A的delegate属性

三、不使用protocol实现代理

首先不使用protocol来实现,这样就可以更好的对比:代理到底有什么好的。

项目中使用到的类

我们现在想让护士来照看孩子,如果孩子出现哭、吃、睡等行为时,护士立马相应,并且做出相应的动作

Baby.h

//
//  Baby.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Cocoa/Cocoa.h>
@class Nurse;

@interface Baby : NSObject

@property (nonatomic, assign) int age;
@property (nonatomic, retain) Nurse *nurse;

-(void)cry;
-(void)eat;
-(void)sleep;

@end

Baby.m

//
//  Baby.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Baby.h"
#import "Nurse.h"

@implementation Baby

-(void)cry
{
    NSLog(@"%d is crying", _age);
    [_nurse cry:self];
}
-(void)eat
{
    NSLog(@"%d is hugry", _age);
    [_nurse eat:self];
}
-(void)sleep
{
    NSLog(@"%d is sleep", _age);
    [_nurse sleep:self];
}

@end

Nurse.h

//
//  Nurse.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
@class Baby;

@interface Nurse : NSObject

-(void)cry:(Baby*) bady;
-(void)eat:(Baby*) bady;
-(void)sleep:(Baby*) bady;

@end

Nurse.m

//
//  Nurse.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Nurse.h"

@implementation Nurse

-(void)cry
{
    NSLog(@"哄孩子");
}
-(void)eat
{
    NSLog(@"喂孩子");
}
-(void)sleep
{
    NSLog(@"让孩子睡觉");
}

@end

main.m

//
//  main.m
//  01-代理模式2
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nurse.h"

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

    @autoreleasepool {
        Nurse *nurse = [[Nurse alloc] init];
        
        Baby *baby = [[Baby alloc] init];
        baby.nurse = nurse;
        [baby cry];
    }
    return 0;
}

似乎这样的实现,并没有什么问题,但是如果有一天,护士突然不照护孩子了,我们将孩子交给一个老师来照料,是不是很多内容还改?

甚至有一天老师也不照料了,我们给孩子的爷爷奶奶来照料,又需要改很多内容

所以,我们可以使用protocol来实现

四、使用protocol实现代理

1⃣️我们先定义一份协议

//
//  LookBaby.h
//  01-代理模式3
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
@class Baby;

@protocol LookBaby <NSObject>

-(void)cry:(Baby*) baby;
-(void)eat:(Baby*) baby;
-(void)sleep:(Baby*) baby;

@end

 

2⃣️Nurse遵循协议,且实现协议中的方法

.h

//
//  Nurse.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "LookBaby.h"
@class Baby;

@interface Nurse : NSObject <LookBaby>

@end

.m

//
//  Nurse.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Nurse.h"

@implementation Nurse

-(void)cry:(Baby*)baby
{
    NSLog(@"哄孩子");
}
-(void)eat:(Baby*)baby
{
    NSLog(@"喂孩子");
}
-(void)sleep:(Baby *)baby
{
    NSLog(@"哄孩子睡觉");
}

@end

3⃣️Baby定义一个实现协议的属性

.h

//
//  Baby.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Cocoa/Cocoa.h>
#import "LookBaby.h"
@class Nurse;

@interface Baby : NSObject

@property (nonatomic, assign) int age;
@property (nonatomic, retain) id <LookBaby> loolBaby;

-(void)cry;
-(void)eat;
-(void)sleep;

@end

.m

//
//  Baby.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Baby.h"
#import "Nurse.h"

@implementation Baby

-(void)cry
{
    NSLog(@"%d is crying", _age);
    [_loolBaby cry:self];
}
-(void)eat
{
    NSLog(@"%d is hugry", _age);
    [_loolBaby eat:self];
}
-(void)sleep
{
    NSLog(@"%d is sleep", _age);
    [_loolBaby sleep:self];
}

@end

4⃣️创建B对象,设置A的delegate属性为B对象

//
//  main.m
//  01-代理模式3
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nurse.h"

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

    @autoreleasepool {
        
        Nurse *nurse = [[Nurse alloc] init];
        Baby *baby = [[Baby alloc] init];
        
        baby.loolBaby = nurse;
        baby.age = 10;
        
        [baby eat];
        
    }
    return 0;
}

 

 

 

posted @ 2014-04-02 12:49  了透糕糟  阅读(1016)  评论(0编辑  收藏  举报