我我的更喜歡把委託(Delegate)模式稱爲代理(Proxy)模式。仍是那句話,第一次接觸代理模式是在Java中接觸的,在Java中實現代理模式和接口是少不了的。當時學習Spring的時候用到了接口回調,其實就是實現的委託代理模式。簡單的說代理就是把相應的功能交給實現接口的相應的類中來解決。在OC中沒有接口該如何實現代理呢?前面的博客中筆者說提了一句,在OC中的協議和Java中的接口極爲類似,都是隻聲明方法而不去實現,方法的實如今OC中交個遵循協議的類,而在Java中方法的實現交給實現接口的類。其實學習一門新的語言和之前學習過的語言對比着理解仍是蠻好理解的,廢話少說,切入正題,談一下OC中的委託代理模式。java
下面仍是用房屋中介和房東的例子來表示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代碼以下:ui
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方法委託給租房中介spa
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
|
實現方法:code
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];
便可,其實本子上就是把上面的兩行代碼進行了一個封裝,大概就是設計模式中的模板方法模式吧。到這的話委託代理模式就差很少了
上面的總結暫且這麼說吧,是根據筆者本身的理解所總結的內容,難免有偏頗之處,歡迎批評指正,轉載請註明出處。