代理
//
// main.m
// 代理讲解
//
#import <Foundation/Foundation.h>
/**
查看帮助总结:
1.快速查看
2.查看文档 路径:点击help-选中第一项 在搜索框填入要搜索的内容,下面就会显示这个知识点的相关内容,可进行查看
*/
/**
设计模式:简单的说就是设计模板。前人预先已经设计好的程序代码(模板),我们只要按照它的要求方式进行编码,就可以实现相应的功能。
作用:提供了一种模板,功能实现起来更加的简单。
分类:单例,
代理/委托,
工厂,
kvc(key-value coding(键值编码)),
观察者(kvo(key-value observing(键值观察),通知),
MVC(model-view-controller(模型-视图-控制器)
代理:也叫委托
定义:A类有一件事情要做,但是自己不想做,让B类帮忙实现。(注意:B类不是固定的某个类,只要能帮我做这件事件的类都可以)
实例:找房子
因素:我们 (Student)(A类)
帮我们找房子的人(代理/中介/第三人) (B类)
*/
#import "Student.h"
#import "Agency.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
//学生的对象
Student *student = [[Student alloc]init];
// [student findHouse];
Agency *myAgency = [[Agency alloc] init];
student.agency = myAgency;
//找代理帮忙
[student findHelp];
}
return 0;
}
//
// main.m
// 找房子改进三
//
#import <Foundation/Foundation.h>
#import "Agency.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Agency *myAgency = [[Agency alloc] init];
//代理去工作
[myAgency agencyWork];
}
return 0;
}
//
// Student.h
// 代理讲解
//
/**
代理:分成主动类(A类),被动类(B类)
一般将协议创建到主动类里面。因为协议里面的功能是主动类所提出,并需要的。
*/
#import <Foundation/Foundation.h>
@class Agency;
//#import "BaseProtocol.h"
//我要找的人必须有的能力,相当于一个统一的标准。
@protocol BaseProtocol <NSObject>
-(void)findHouse;
@end
@interface Student : NSObject{
//Agency *_agency;//代理对象指针
//遵守了BaseProtocol这个协议的任意对象
//id<BaseProtocol> _delegate;//代表任意类型的对象,但是他要有找房子的能力
}
//-(void)setAgency:(Agency *)agency;
//-(Agency *)agency;
//-(void)setDelegate:(id<BaseProtocol>)delegate;
//-(id<BaseProtocol>)delegate;
@property id<BaseProtocol>delegate;
////自己找房子
//-(void)findHouse;
//不想自己找了,找中介帮忙找
-(void)findHelp;
@end
//
// Student.m
// 代理讲解
//
#import "Student.h"
#import "Agency.h"
@implementation Student
//-(void)setAgency:(Agency *)agency{
// _agency = agency;
//}
//-(Agency *)agency{
// return _agency;
//}
//-(void)setDelegate:(id<BaseProtocol>)delegate{
// _delegate = delegate;
//}
//
//-(id<BaseProtocol>)delegate{
// return _delegate;
//}
//-(void)findHouse{
// NSLog(@"自己找房子");
//}
-(void)findHelp{
//以后,如果给成员变量写了setter(set),getter(get)方法,就尽量使用。语法
//容错处理
if ([self.delegate respondsToSelector:@selector(findHouse)]) {
//任意对象找房子
[self.delegate performSelector:@selector(findHouse)];
}else{
NSLog(@"它不能给我找房子");
}
}
@end
//
// Agency.h
// 代理讲解
//
#import <Foundation/Foundation.h>
#import "Student.h"
@interface Agency : NSObject<BaseProtocol>{
//Student *_student;//创建一个学生类的对象指针
}
//-(void)setStudent:(Student *)student;
//-(Student *)student;
@property Student *student;
//代理类的工作
-(void)agencyWork;
@end
//
// Agency.m
// 代理讲解
//
#import "Agency.h"
@implementation Agency
//-(void)setStudent:(Student *)student{
// _student = student;
//}
//-(Student *)student{
// return _student;
//}
-(void)agencyWork{
//创建学生类对象
self.student = [[Student alloc]init];
//通过self将代理类设置成student的delegate对象 *************
self.student.delegate = self;
//学生找帮助
[self.student findHelp];
}
//标记,容易找到对应的代码
#pragma mark - 委托方法
-(void)findHouse{
NSLog(@"代理帮忙找房子");
}
@end