- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
代理设计模式的基本概念
代理设计模式的使用场合
学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)
如何声明一个协议,协议的注意点
一、本章笔记
1.什么是设计模式
设计模式(design pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式 是为了 可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式已于他人于系统 都是多赢的
设计模式 使 代码编制真正工程化;
设计模式 是软件工程的基石脉络,如同大夏的结构一样
例子
生活中大家一定遇到这样的情况了:
比如 说
我要买一包纸, 不妨就是心心相印。
那么一般人的话 我应该不是去心心相印的工厂里面去直接买把。
而是 我们在心心相印 专卖店 或者 什么超市的。
这些地方购买。这些地方实际上就是洁丽雅毛巾的代理
这气势和我们OO中的代理模式是很相似的。
代理设计模式的场合
当对象A 发生了一些行为, 想告诉 对象B(让对象B 称为对象A的代理对象)
对象B 想监听对象A的行为 (让 对象B 成为对象A的代理对象)
当对象A 无法处理某些行为的时候,想让对象B帮忙处理 (让 对象B 成为对象A的代理对象)
二、code
main.m
#pragma mark 04-代理设计模式
#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 *s = [Student new];
#pragma mark 错误信息1
/*
b.nanny = s; // incompatible pointer types assgining to 'Nanny *' from 'Student *' 保姆的对象 不是 学生的对象
如果Student没有实现保姆的方法 就会报错2
'-[Student feedFood:]: unrecognized selector sent to instance 0x100100620'
*/
// b.nanny = s;
// 5.再次换保姆
Teacher *t = [Teacher new];
// b.nanny = t;
Dog *d = [Dog new];
b.nanny = d;
// 5.婴儿发飙
[b food];
[b sleeply];
return 0;
}
BabyProcotol
>>>.h
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProcotol <NSObject>
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby;
@end
Baby
>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@class Nanny,Student;
@interface Baby : NSObject
/*
什么是代理设计模式
心心相印 和 超市
超市 就是心心相印的代理 它可以帮助 心心相印 买纸巾
也就是说,代理也帮助 另外一个类做一些事情
代理设计模式的应用场景
1.当A对象 想 监听B对象的一些变化时,可以使用代理设计模式
保姆想监听婴儿的变化,那么保姆就可以成为婴儿的代理,当婴儿发生变化之后 保姆就可以监听到
2.当B对象发生一些事情,想通知 A 队形的时候,可以使用代理设计模式
婴儿想通知保姆,那么就可以让保姆成为婴儿的代理,只要保姆成为婴儿的代理,以后婴儿发生变化 就可以通知保姆
3.当对象A 无法处理某些行为的时候, 想让对象B帮忙处理(让对象B成为对象A的代理对象)
婴儿无法吃东西,也无法自己入睡,所以可以通过保姆帮忙处理。只要让保姆成为婴儿的代理 就可以帮婴儿喂他吃东西 和哄她睡觉
*/
// 饥饿程度
@property (nonatomic,assign) int hungry;
// 睡意
@property (nonatomic,assign) int sleep;
// 让婴儿拥有一个保姆
//@property (nonatomic,strong) Nanny *nanny;
//@property (nonatomic,strong) Student *student;
// 如果使用id类来接收保姆,如果将来换保姆了,婴儿类不用修改代码
//@property (nonatomic,strong) id nanny;
// 引发出协议,作为保姆 必须要有 喂婴儿和 哄婴儿睡觉的方法
@property (nonatomic,strong) id<BabyProcotol> nanny;
// 吃东西
- (void)food;
// 睡觉
- (void)sleeply;
@end
>>>.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)sleeply
{
self.sleep +=5;
NSLog(@"困了 %i",self.sleep);
// 通知保姆
if ([self.nanny respondsToSelector:@selector(hongBady:)]) {
[self.nanny hongBady:self];
}
}
@end
Nanny
>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@class Baby;
@interface Nanny : NSObject<BabyProcotol>
/*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby;
*/
@end
>>>.m
#import "Nanny.h"
#import "Baby.h"
@implementation Nanny
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
baby.hungry -= 10;
NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
baby.sleep += 10;
NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end
Student
>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@class Baby;
@interface Student : NSObject<BabyProcotol>
/*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby;
*/
@end
>>>.m
#import "Student.h"
#import "Baby.h"
@implementation Student
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
baby.hungry -= 10;
NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
baby.sleep += 10;
NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end
Teacher
>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@interface Teacher : NSObject<BabyProcotol>
@end
>>>.m
#import "Teacher.h"
#import "Baby.h"
@implementation Teacher
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
baby.hungry -= 10;
NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
baby.sleep += 10;
NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end
Dog
>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@interface Dog : NSObject<BabyProcotol>
@end
>>>.m
#import "Dog.h"
#import "Baby.h"
@implementation Dog
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
baby.hungry -= 10;
NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
baby.sleep += 10;
NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end
网友评论