1,代理模式的概念
传入的对象,代替当前的类完成了某个功能,我们称之为代理模式。在OC中,代理设计模式是经常遇到的一种设计模式。
2,实现代理设计模式思路和步骤
1,定义一个协议(写在外面或者里面随便)并声明代理类需要实现的方法列表。
2,创建一个代理类,并遵守上面的协议。
3,在需要被代理的类中定义一个对象类型为ID并且遵守代理协议的成员变量。
4,在被代理的类中调用上面的成员变量_delegate(代理)的方法,调用代理类的方法。
5,在需要使用代理的地方为被代理的类的成员变量赋值。
3,代理设计模式的用处
1,可以用来监听,代理可以监听被代理的一些行为并实现相应的方法。
2,可以用来通知,被代理的类发生了一些行为,可以第一时间通知代理。
3,代处理,当被代理对象无法完成某些行为时,可以委托代理来完成。
4,事例程序
今天,我突然有急事,更新不了blog,但是我很想更新,于是我想我的代理CSDN帮我发blog。
//
// Yuzee.h
//
// Created by on 15/7/22.
// Copyright (c) 2015年 All rights reserved.
//
#import <Foundation/Foundation.h>
//2,于是我定义了一个协议,声明了一个可以发博客的blog方法。
@protocol YuzeeProtocol <NSObject>
- (void)blog;
@end
//1,首先我创建一个Yuzee的类,代表我。并且我有一个Thinkblog的方法,代表我想发blog,但是我没有发blog的方法。
@interface Yuzee : NSObject
//定义一个对象类型为id且遵守协议的成员变量delegate(固定写法)
@property (nonatomic , weak) id<YuzeeProtocol> delegate;
- (void)Thinkblog;
@end
//
// CSDN.m
//
// Created by on 15/7/22.
// Copyright (c) 2015年 All rights reserved.
//
#import "CSDN.h"
#import "Yuzee.h"
//3,接着我又创建了一个代理类名字为CSDN,并且使我的代理遵守协议
@interface CSDN () <YuzeeProtocol>
@end
@implementation CSDN
//4,我的代理CSDN遵守了我的协议,也就拥有了协议中的方法名,于是在代理中写上实现功能的代码。
- (void)blog{
NSLog(@"CSDN正在代理发博客......");
}
@end
//
// Yuzee.m
//
// Created by on 15/7/22.
// Copyright (c) 2015年 All rights reserved.
//
#import "Yuzee.h"
@implementation Yuzee
//5,当我实现了想发博客的功能时,会通知代理。
- (void)Thinkblog{
NSLog(@"Yuzee想发博客......");
//6,就可以调用代理的blog方法代替我发blog
[self.delegate blog];
}
@end
//
// main.m
// 发博客-代理模式
//
// Created by on 15/7/22.
// Copyright (c) 2015年 All rights reserved.
//
//7,需要调用代理的的时候,将代理类的对象赋值为自己的代理(delegate)即可。
#import <Foundation/Foundation.h>
#import "CSDN.h"
#import "Yuzee.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Yuzee *uzee = [Yuzee new];
CSDN *SDN = [CSDN new];
uzee.delegate = SDN;
[uzee Thinkblog];
}
return 0;
}