oc66--代理模式应用2

简介:
复制代码
//
//  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;
}
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7437248.html,如需转载请自行联系原作者

相关文章
|
Swift
OC 和 swift 创建单例方法
OC 和 swift 创建单例方法
289 0
|
Java API 移动开发
设计模式三: 代理模式(Proxy) -- JDK的实现方式
简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问。 类图 实现 JDK自带了Proxy的实现, 下面我们先使用JDK的API来演示代理如何使用, 随后再探究Proxy的实现原理,并自己来实现Proxy.
1029 0
|
C# Java iOS开发