OC语言day07-04代理设计模式

pragma mark 代理设计模式

pragma mark 概念

/**
 1.什么是设计模式
    设计模式(design pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
    使用设计模式 是为了 可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式已于他人于系统 都是多赢的
    设计模式 使 代码编制真正工程化;
    设计模式 是软件工程的基石脉络,如同大夏的结构一样
 
 例子
    生活中大家一定遇到这样的情况了:
    比如 说 
    我要买一包纸, 不妨就是心心相印。
    那么一般人的话 我应该不是去心心相印的工厂里面去直接买把。
    而是 我们在心心相印 专卖店 或者 什么超市的。
    这些地方购买。这些地方实际上就是洁丽雅毛巾的代理
    这气势和我们OO中的代理模式是很相似的。
 
 代理设计模式的场合
    当对象A 发生了一些行为, 想告诉 对象B(让对象B 称为对象A的代理对象)
    对象B 想监听对象A的行为 (让 对象B 成为对象A的代理对象)
    当对象A 无法处理某些行为的时候,想让对象B帮忙处理  (让 对象B 成为对象A的代理对象)
 
 */

pragma mark 代码

#import 
#pragma mark 类
#import "Baby.h"
#import "Nanny.h"
#import "Student.h"
#import "Teacher.h"
#import "Dog.h"
#pragma mark main函数
int main(int argc, const char * argv[])
{
    
    // 1.创建婴儿
    Baby *b = [Baby new];
    // 2.创建保姆
//    Nanny *n = [Nanny new];
    // 3.将保姆赋值给婴儿
//    b.nanny = n;
    
    // 4.换保姆
//    Student *stu = [Student new];
//    b.nanny = stu;
    
    // 5.老师
//    Teacher *t = [Teacher new];
//    b.nanny = t;

    // 6.狗
    Dog *d = [Dog new];
    b.nanny = d;
    
    // 4. 婴儿发表
    [b food];
    [b sleepy];
    
    
    
    return 0;
}

协议

BabyProtocol.h
#import 
@class Baby;

@protocol BabyProtocol 

// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;

// 哄婴儿睡觉
- (void)hongBaby:(Baby *)baby;
@end

Baby.h //婴儿类
#import 
#import "BabyProtocol.h"
@class Nanny,Student;
/**
 什么是代理设计模式
 
 心心相印 和 超市
 超市 就是 心心相印的代理, 它可以帮助心心相印卖纸巾
 也就是说, 代理可以保住 另一个类 做一些事情
 
 代理设置模式的应用场景
 A 监听 B
 1.当A对象(保姆) 想监听 B对象(婴儿)的一些变化时, 可以使用代理设计模式
    保姆 想监听婴儿的变化,那么保姆就可以成为婴儿的代理,当婴儿发生变化之后 保姆就可以监听到
 
 B 通知 A
 2.当B对象发生一些事情,想通知A对象的时候,可以使用代理设计模式 
    婴儿想通知保姆, 那么久可以让保姆成为婴儿的代理,只要保姆成为婴儿的代理,以后婴儿发生变化 就可以通知保姆
 
 3.(当对象A 无法处理某些行为的时候,想让对象B帮忙处理)
    婴儿无法自己吃东西, 也无法自己入睡,所以可以让保姆帮忙处理,只要让保姆成为婴儿的代理 就可以帮婴儿喂他吃东西 和 哄他睡觉
 */

@interface Baby : NSObject

// 饥饿程度
@property (nonatomic,assign)int hungry;

// 睡意
@property (nonatomic,assign)int sleep;

// 吃东西
- (void)food;
// 困了
- (void)sleepy;

#warning 这里保姆 不仅仅是保姆 可以是学生、老师
// 让婴儿拥有一个保姆 类
//@property (nonatomic,strong) Nanny *nanny;
//@property(nonatomic, strong)Student *stu;

#warning 如果使用id类型来 接受保姆, 如果将来换保姆了,婴儿类 不用修改代码
//@property(nonatomic, strong)id<协议> nanny;
@property(nonatomic, strong)id nanny;

@end

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

@implementation Baby


- (void)food
{
    self.hungry += 5;
    NSLog(@"吃东西 %i",self.hungry);
    
    // 通知保姆
    // 喂小孩吃东西
    
#warning 类型限定 : 仅仅能够限定别人传递的对象有没有实现了这个协议.    并不能保证别人一定实现了这个方法
    // 所以要判断别人有没有实现了这个方法
    if ([self.nanny respondsToSelector:@selector(feedFood:)]) {
        [self.nanny feedFood:self];
        
    }
    // 如果别人遵循协议 没有实现方法 会直接报错
//    [self.nanny feedFood:self];
}

-(void)sleepy
{
    self.sleep += 5;
    NSLog(@"困了 %i",self.sleep);
    
    // 通知保姆
    // 哄婴儿
#warning 类型限定 : 仅仅能够限定别人传递的对象有没有实现了这个协议.    并不能保证别人一定实现了这个方法
    // 所以要判断别人有没有实现了这个方法
    if ([self.nanny respondsToSelector:@selector(hongBaby:)]) {
        [self.nanny hongBaby:self];
    }
    // 如果别人遵循协议 没有实现方法 会直接报错
//    [self.nanny hongBaby:self];
}
@end

Nanny.h //保姆类
#import 
#import "BabyProtocol.h"
@class Baby;

@interface Nanny : NSObject 

/*
// 喂婴儿吃东西
- (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

Student.h //学生类
#import 
#import "BabyProtocol.h"
@class Baby;
@interface Student : NSObject 

/*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;

// 哄婴儿睡觉
- (void)hongBaby:(Baby *)baby;
*/

@end
Student.m
#import "Student.h"
#import "Baby.h"
@implementation Student

- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}

- (void)hongBaby:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿 %i",baby.sleep);
}

@end

Teacher.h //老师类
#import 
#import "BabyProtocol.h"
@interface Teacher : NSObject 


@end
Teacher.m
#import "Teacher.h"
#import "Baby.h"

@implementation Teacher
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}

- (void)hongBaby:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿 %i",baby.sleep);
}
@end

Dog.h //狗类
#import 
#import "BabyProtocol.h"
@interface Dog : NSObject 

@end
Dog.m
#import "Dog.h"
#import "Baby.h"
@implementation Dog
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}

- (void)hongBaby:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿 %i",baby.sleep);
}
@end

你可能感兴趣的:(OC语言day07-04代理设计模式)