OC学习篇之-----委托代理

委托代理,其实个人感觉就是一个协议的运用,本质上个人觉的并没什么不同!协议等下再发表
委托模式:
两个对象不能够直接没联系,需要通过一个第三方对象,帮助他们联系,这一种模式,我们称之为‘委托模式’
如何在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关键字,上面代码有写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值