Objective-C中的委托(代理)模式


        我個人更喜歡把委托(Delegate)模式稱為代理(Proxy)模式。還是那句話,第一次接觸代理模式是在Java中接觸的,在Java中實現代理模式和接口是少不了的。當時學習Spring的時候用到了接口回調,其實就是實現的委托代理模式。簡單的說代理就是把相應的功能交給實現接口的相應的類中來解決。在OC中沒有接口該如何實現代理呢?前面的博客中筆者說提了一句,在OC中的協議和Java中的接口極為相似,都是只聲明方法而不去實現,方法的實現在OC中交個遵循協議的類,而在Java中方法的實現交給實現接口的類。其實學習一門新的語言和以前學習過的語言對比着理解還是蠻好理解的,廢話少說,切入正題,談一下OC中的委托代理模式。

        下面還是用房屋中介和房東的例子來表示OC中的代理模式。包租公把房子委托給租房中介來出租,包租公每月收房租就ok啦~。

         1.在Java中寫代理的話,我會先寫房屋中介的接口,所以在OC中我們首先也要先聲明房屋中介的協議,Protocol中的方法是每個房屋中介必須有的方法,所以在Java中會抽象成接口,而在OC中我們會把他聲明為協議,然后讓每個方法聲明為必須的,協議如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
//  RentHouse.h
//  Memory
//
//  Created by ludashi on 14-8-7.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol RentHouse <NSObject>
//在賣房子協議里定義兩個必須的方法
@required
//中介賣房子
- ( void )rentHouse;
//把錢給用戶
- ( void )payMoney;
@end

       2.房屋中介的協議聲明完我們先不用着急,聲明中介類的,因為中介太多啦! 包租公要租房房子,客戶就是上帝,所以我們先變包租公類, 包租公對中介公司的要求不高只要能給我把房子租出去,然后給錢就完事,所以只要遵守之前定義的房屋中介的協議即可,我們可以這樣定義包租公:

        interface代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//  Landlord.h
//  Memory
//
//  Created by 魯大師 on 14-8-7.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//
 
#import <Foundation/Foundation.h>
//引入協議
#import "RentHouse.h"
@interface Landlord : NSObject
//房東的中介公司,符合買房子和付款都行
//agent是符合協議的對象傳入都行
@property (assign) id<RentHouse> agent;
 
//往外租房,委托給代理公司
-( void ) rentHouse;
 
//包租婆收租啦
-( void ) receiveMoney;
@end

    實現代碼: 在實現代碼中包租公會把房子通過協議中的saleHouse方法委托給租房中介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import "Landlord.h"
 
@implementation Landlord
 
//往外租房,委托給代理公司
-( void ) rentHouse
{
     NSLog(@ "我是包租公: ludashi, 我把房子租出去了!" );
     //調用委托公司的賣房方法,委托關系調用
     [self.agent rentHouse];
}
 
 
//包租婆收租啦
-( void ) receiveMoney
{
     NSLog(@ "ludashi: 每個月我包租公最高興,因為又可以收租啦!" );
}
@end

         3.包租公妥啦以后我們就開始找中介公司啦,中介公司首先得符合我們的協議(在java中就是要實現我們之前的接口),在中介公司中因為要和包租公建立合作關系所以用到了包租公的類,我們用@class來聲明,目的減少模塊之間的耦合性。

            interface代碼如下:

1
2
3
4
5
6
7
8
9
#import <Foundation/Foundation.h>
//引入協議文件
#import"RentHouse.h"
//為了解耦我們用@class聲明房東類,代替引入房東的頭文件
@ class  Landlord;
@interface HouseSaler : NSObject<RentHouse>
//房東為中介的客戶,所以定義一個客戶對象
@property (assign) Landlord *customer;
@end

 

        實現方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import "HouseSaler.h"
#import "Landlord.h"
 
@implementation HouseRent
//實現賣房方法
-( void )RentHouse
{
     NSLog(@ "agent: 租房了,我在有好多房子;" );
     [self payMoney];
 
}
//付錢給用戶
-( void ) payMoney
{
     NSLog(@ "agent:房子租出去啦!哎!得把錢給用戶啊!!" );
     [self.customer receiveMoney];
}
@end

    4.測試:包租公要找中介公司

1
2
3
4
5
6
7
8
9
10
11
12
//委托模式的測試
//實例化包租公
Landlord *ludashi = [Landlord  new ];
//實例化中介
HouseSaler *agent = [HouseRent  new ];
 
//用戶選擇代理公司,這個公司只要遵守出租協議即可
ludashi.agent = agent;
agent.customer = ludashi;
 
//房東買房
[ludashi rentHouse];

 

    運行結果:

1
2
3
4
2014-08-07 18:04:01.717 Memory[21273:303] 我是包租公: ludashi, 我把房子租出去了!
2014-08-07 18:04:01.719 Memory[21273:303] agent: 租房了,我在有好多房子;
2014-08-07 18:04:01.719 Memory[21273:303] agent:房子租出去啦!哎!得把錢給用戶啊!!
2014-08-07 18:04:01.720 Memory[21273:303] ludashi: 每個月我包租公最高興,因為又可以收租啦!

 

  上面測試時我們是通過代碼直接把房屋出租公司和包租公進行合作關系的,更合理的做法是在租賃公司中加一個注冊方法,方便用戶和租賃公司形成委托關系,所以很有必要實現我們的register方法,在房屋租賃公司里加入注冊方法,其他的不需要改變,代碼如下:

1 //實現注冊方法,把房東的對象傳入中介
2 -(void)registerInfo:(Landlord *)vCustomer
3 {
4     //建立委托關聯,產生委托關系
5     self.customer = vCustomer;
6     //包租公選擇了一家符合協議的房屋出租公司
7     self.customer.agent = self;
8 }

  那么我們進行測試的時候需要通過register方法來進行成立合作關系

  測試時把代碼

1 //用戶選擇代理公司,這個公司只要遵守出租協議即可
2 ludashi.agent = agent;
3 agent.customer = ludashi;

  換成

        //用戶在房屋出租公司進行用戶注冊形成合作關系
        [agent registerInfo:ludashi];

  即可,其實本子上就是把上面的兩行代碼進行了一個封裝,大概就是設計模式中的模板方法模式吧。到這的話委托代理模式就差不多了

  上面的總結暫且這么說吧,是根據筆者自己的理解所總結的內容,不免有偏頗之處,歡迎批評指正,轉載請注明出處。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM