設計模式之Protocol實現代理模式

  • 使用場合
  • 使用步驟
  • 不使用protocol實現代理
  • 使用protocol實現代理

1、使用場合app

  1. A想讓B幫忙,就讓B代理
  2. A想通知B發生了一些事情,或者傳一些數據給B
  3. 觀察者模式

2、使用步驟atom

  1. 定義一份協議
  2. B遵循協議,而且實現相應的方法
  3. A中定義一個代理屬性:id <協議> delegate
  4. 建立B對象,將其附值給A的delegate屬性

3、不使用protocol實現代理spa

首先不使用protocol來實現,這樣就能夠更好的對比:代理到底有什麼好的。代理

項目中使用到的類code

咱們如今想讓護士來照看孩子,若是孩子出現哭、吃、睡等行爲時,護士立馬相應,而且作出相應的動做對象

Baby.hblog

//
//  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.mit

//
//  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.hio

//
//  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.mclass

//
//  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來實現

4、使用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;
}
相關文章
相關標籤/搜索