標籤:java io 檔案 2014 cti div 代碼 line
我個人更喜歡把委託(Delegate)模式成為代理(Proxy)模式。還是那句話,第一次接觸代理模式是在Java中接觸的,在Java中實現代理模式和介面是少不了的。當時學習Spring的時候用到了介面回調,其實就是實現的委託代理模式。簡單的說代理就是把相應的功能交給實現介面的相應的類中來解決。在OC中沒有介面該如何?代理呢?前面的部落格中筆者說提了一句,在OC中的協議和Java中的介面極為相似,都是只聲明方法而不去實現,方法的實現在OC中交個遵循協議的類,而在Java中方法的實現交給實現介面的類。其實學習一門新的語言和以前學習過的語言對比著理解還是蠻好理解的,廢話少說,切入正題,談一下OC中的委託代理模式。
下面還是用房屋中介和房東的例子來表示OC中的代理模式。包租公把房子委託給租房中介來出租,包租公每月收房租就ok啦~。
1.在Java中寫代理的話,我會先寫房屋中介的介面,所以在OC中我們首先也要先聲明房屋中介的協議,Protocol中的方法是每個房屋中介必須有的方法,所以在Java中會抽象成介面,而在OC中我們會把他聲明為協議,然後讓每個方法聲明為必須的,協議如下:
12345678910111213141516 |
// // SaleHouse.h // Memory // // Created by ludashi on 14-8-7. // Copyright (c) 2014年 Mr.li. All rights reserved. // #import <Foundation/Foundation.h> @protocol SaleHouse <NSObject> //在賣房子協議裡定義兩個必須的方法 @required //中介賣房子 - ( void )saleHouse; //把錢給使用者 - ( void )payMoney; @end |
2.房屋中介的協議聲明完我們先不用著急,聲明中介類的,因為中介太多啦! 包租公要租房房子,客戶就是上帝,所以我們先變包租公類, 包租公對中介公司的要求不高只要能給我把房子租出去,然後給錢就完事,所以只要遵守之前定義的房屋中介的協議即可,我們可以這樣定義包租公:
interface代碼如下:
123456789101112131415161718192021 |
// Landlord.h // Memory // // Created by 魯大師 on 14-8-7. // Copyright (c) 2014年 Mr.li. All rights reserved. // #import <Foundation/Foundation.h> //引入協議 #import "SaleHouse.h" @interface Landlord : NSObject //房東的中介公司,符合買房子和付款都行 //agent是符合協議的對象傳入都行 @property (assign) id<SaleHouse> agent; //往外租房,委託給代理公司 -( void ) saleHouse; //包租婆收租啦 -( void ) receiveMoney; @end |
實現代碼: 在實現代碼中包租公會把房子通過協議中的saleHouse方法委託給租房中介
12345678910111213141516171819 |
#import "Landlord.h" @implementation Landlord //往外租房,委託給代理公司 -( void ) saleHouse { NSLog(@ "我是包租公: ludashi, 我把房子租出去了!" ); //調用委託公司的賣房方法,委託關係調用 [self.agent saleHouse]; } //包租婆收租啦 -( void ) receiveMoney { NSLog(@ "ludashi: 每個月我包租公最高興,因為又可以收租啦!" ); } @end |
3.包租公妥啦以後我們就開始找中介公司啦,中介公司首先得符合我們的協議(在java中就是要實現我們之前的介面),在中介公司中因為要和包租公建立合作關係所以用到了包租公的類,我們用@class來聲明,目的減少模組之間的耦合性。
interface代碼如下:
123456789 |
#import <Foundation/Foundation.h> //引入協議檔案 #import"SaleHouse.h" //為瞭解耦我們用@class聲明房東類,代替引入房東的標頭檔 @ class Landlord; @interface HouseSaler : NSObject<SaleHouse> //房東為中介的客戶,所以定義一個客戶對象 @property (assign) Landlord *customer; @end |
實現方法:
123456789101112131415161718 |
#import "HouseSaler.h" #import "Landlord.h" @implementation HouseSaler //實現賣房方法 -( void )saleHouse { NSLog(@ "agent: 租房了,我在有好多房子;" ); [self payMoney]; } //付錢給使用者 -( void ) payMoney { NSLog(@ "agent:房子租出去啦!哎!得把錢給使用者啊!!" ); [self.customer receiveMoney]; } @end |
4.測試:包租公要找中介公司
123456789101112 |
//委託模式的測試 //執行個體化包租公 Landlord *ludashi = [Landlord new ]; //執行個體化中介 HouseSaler *agent = [HouseSaler new ]; //使用者選擇代理公司,這個公司只要遵守出租協議即可 ludashi.agent = agent; agent.customer = ludashi; //房東買房 [ludashi saleHouse]; |
運行結果:
1234 |
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: 每個月我包租公最高興,因為又可以收租啦! |