委托代理,其实个人感觉就是一个协议的运用,本质上个人觉的并没什么不同!协议等下再发表
委托模式:
两个对象不能够直接没联系,需要通过一个第三方对象,帮助他们联系,这一种模式,我们称之为‘委托模式’
如何在OC中使用委托模式?在OC中实现一个委托模式需要在OC中的一个元素‘protocol’,即是协议
比如房东要卖房子,但是找卖家太难了(两个对象不能够直接联系),所以房东通过房产中介(第三方对象)来卖掉房子,问题就来了,既然你帮我卖房子,那你就必须给我吧房子给卖掉,然后给我钱,我再给你提成:这些就是用到的协议。房东这样子做就是委托中介了,那么中介就是一个代理了,一下是代码实现了
1.首先要先有协议来遵守,创建一个协议,协议里面有两个方法-(void)mustSaleHouse; -(void)payMoney;@required表示遵守这个协议的对象这两个方法必须实现,
#import <Foundation/Foundation.h>
@protocol Landlord_protocol <NSObject>
@required
-(void)mustSaleHouse;
-(void)payMoney;
@end
2.房东
#import <Foundation/Foundation.h>
//#import "HouseSaler.h"
@class HouseSaler;
#import "Landlord_protocol.h"
@interface Landlord : NSObject
//1.这是最简单的委托模式
//这里选择用assign 是为了防止循环引用
//@property(nonatomic,assign)HouseSaler *delegate;
//使用正式协议的委托模式
@property(nonatomic,assign)id<Landlord_protocol> delegate;
-(void)registerHouse;
//用于表示房东收到钱啦
-(void)receiveMoney;
@end
2.1以下是房东类的.m文件
//如果委托存在,并且遵守协议
-(void)registerHouse{
//以下是必须的,因为当你使用代理的时候,你要判断代理了是否存在,并且代理是否已经遵循了制定的协议
if (self.delegate && [self.delegate conformsToProtocol:@protocol(Landlord_protocol)]) {
NSLog(@"我找到中介了,我已经将房子登记到中介处了");
[self.delegate mustSaleHouse];
[self.delegate payMoney];
}else {
NSLog(@"我是房东,没有中介为我代理");
}
}
-(void)receiveMoney{
NSLog(@"我是房东,我收到钱了");
}
3.以下是中介类的.h文件
#import <Foundation/Foundation.h>
#import "Landlord_protocol.h"
#import "Landlord.h"
@interface HouseSaler : NSObject<Landlord_protocol>
//下面这个属性是中介的客户类,
@property(nonatomic,assign)Landlord *customer;
//这是中介的私有方法
-(void)saleHouse;
@end
4.以下是中介的.M文件
#import "HouseSaler.h"
@implementation HouseSaler
//自己卖房的方法
-(void)saleHouse{
NSLog(@"我是中介,我要替卖家卖房子");
}
//实现协议里面必须实现的方法
-(void)mustSaleHouse{
NSLog(@"我是中介,已与房东签协议,必须把房东的房子卖掉");
}
-(void)payMoney{
NSLog(@"我是中介,我卖房子啦,钱给了房东");
[self.customer receiveMoney];
}
@end
5.以下是ViewController中运用的代码
#import "ViewController.h"
#import "HouseSaler.h"
#import "Landlord.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/*
委托模式:
两个对象不能够直接没联系,需要通过一个第三方对象,帮助他们联系,这一种模式,我们称之为‘委托模式’
如何在OC中使用委托模式?在OC中实现一个委托模式需要在OC中的一个元素‘protocol’,即是协议
*/
HouseSaler *kouseSaler = [HouseSaler new];
Landlord *landlord = [Landlord new];
landlord.delegate = kouseSaler;
kouseSaler.customer = landlord;
[landlord registerHouse];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
6.以下是运行效果
2015-12-23 09:51:13.353 OC_10_02[556:11049] 我找到中介了,我已经将房子登记到中介处了
2015-12-23 09:51:13.354 OC_10_02[556:11049] 我是中介,已与房东签协议,必须把房东的房子卖掉
2015-12-23 09:51:13.354 OC_10_02[556:11049] 我是中介,我卖房子啦,钱给了房东
2015-12-23 09:51:13.354 OC_10_02[556:11049] 我是房东,我收到钱了
总结:委托代理个人感觉非常的强大,因为可以通过代理的模式与第三个类间接联系,其中协议在其中起了非常大的作用,委托代理应该是以后UI经常要用到的模式
注意:房东类和中介类是互相引用的,为了解决循环引用的问题,互相应用的头文件中不可以用#impor,其中一方要用@class关键字,上面代码有写