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