1. 程式人生 > >oc66--代理模式應用2

oc66--代理模式應用2

修改 esp 無法 sleep har imp selector pan net

//
//  BabyProtocol.h

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

@protocol BabyProtocol <NSObject>
// 餵嬰兒吃東西
- (void)feedFood:(Baby *)baby;

// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
@end
//
//  Baby.h
//  day17

#import <Foundation/Foundation.h>
#import "BabyProtocol.h"

@class Nanny, Studnet;

/* 什麽是代理設計模式 心相印和超市 超市就是心相印的代理, 它可以幫助心相印賣紙巾 也就是說, 代理也幫助另外一個類做一些事情 代理設計模式的應用場景 3.當對象A無法處理某些行為的時候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象) , 代理就相當於助手一樣。 嬰兒無法自己吃東西, 也無法自己入睡, 所以可以讓保姆幫忙處理. 只要讓保姆成為嬰兒的代理就可以幫嬰兒餵它吃東西和哄他睡覺 */ @interface Baby : NSObject // 饑餓程度 @property (nonatomic, assign) int hungry; // 睡意 @property (nonatomic, assign) int
sleep; // 吃東西 - (void)food; // 困了 - (void)sleepy; // 讓嬰兒擁有一個保姆 //@property (nonatomic, strong) Nanny *nanny; //@property (nonatomic, strong) Studnet *stu; // 如果使用id類型來接收保姆, 如果將來換保姆了, 嬰兒類不用修改代碼,id就是object, @property (nonatomic, strong) id<BabyProtocol> nanny; @end
//
//  Baby.m


#import "Baby.h"
#import
"Nanny.h" @implementation Baby - (void)food { self.hungry += 5; NSLog(@"要吃東西 %i", self.hungry); // 通知保姆 if ([self.nanny respondsToSelector:@selector(feedFood:)]) { [self.nanny feedFood:self]; } } - (void)sleepy { self.sleep += 5; NSLog(@"困了 %i", self.sleep); // 通知保姆 if ([self.nanny respondsToSelector:@selector(hongBaby:)]) { [self.nanny hongBaby:self]; } } @end
//
//  Nanny.h

#import <Foundation/Foundation.h>
#import "BabyProtocol.h"
@class Baby;
@interface Nanny : NSObject <BabyProtocol>

/*
// 餵嬰兒吃東西
- (void)feedFood:(Baby *)baby;

// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
 */
@end
//
//  Nanny.m


#import "Nanny.h"
#import "Baby.h"

@implementation Nanny


- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"餵嬰兒吃東西 %i", baby.hungry);
}

- (void)hongBaby:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄嬰兒睡覺 %i", baby.sleep);
}
@end
//
//  Studnet.h

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

@interface Studnet : NSObject <BabyProtocol>
/*
// 餵嬰兒吃東西
- (void)feedFood:(Baby *)baby;

// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
 */
@end
//
//  Studnet.m


#import "Studnet.h"
#import "Baby.h"

@implementation Studnet
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"餵嬰兒吃東西 %i", baby.hungry);
}

- (void)hongBaby:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄嬰兒睡覺 %i", baby.sleep);
}
@end
//
//  main.m
//  協議的應用場景2-代理設計模式

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nanny.h"
#import "Studnet.h"
#import "Teacher.h"
#import "Dog.h"


int main(int argc, const char * argv[]) {
    // 1.創建嬰兒
    Baby *b = [Baby new];
    // 2.創建保姆
    Nanny *n = [Nanny new];
    // 3.將保姆賦值給嬰兒呢
    b.nanny = n;
    
    // 4.換保姆
    Studnet *stu = [Studnet new];
    b.nanny = stu;
    
    // 5.再次換保姆
    Teacher *tea = [Teacher new];
    b.nanny = tea;
    
    Dog *d = [Dog new];
    b.nanny = d;
    
    //4.嬰兒發飆
    [b food];
    [b sleepy];
     
    return 0;
}

oc66--代理模式應用2