IOS中的代理模式


代理模式介紹:


代理模式官方定義是:為其他對象提供一種代理以控制對這個對象的訪問。
所謂代理,就是一個人或者一個機構代表另一個人或者另一個機構采取行動。
在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可
以在客戶端和目標對象之間起到中介的作用。

舉個好理解的例子來說明:


一個人Person對象,想去買電影票(詢問電影票的剩余量,票價等信息),
但是由於自己沒有空,所以他只能委托一個中介(代理商Agent對象)
幫他去完成這個動作,最后代理商可以把(詢問的電影票相關信息)
回饋給Person。這就是一種典型的設計模式

為了展示這個例子,首先建立2個類,Person類和Agent類,下面是Person類的代碼清單:

Person.h


#import <Foundation/Foundation.h>
#import "Agent.h"
@interface Person : NSObject
{

}
@property(retain,nonatomic) Agent * delegate;  //為Person 設置一個代理Agent!
- (void)Ticketinfo;

@end


Person.m


#import "Person.h"

@implementation Person

- (void)Ticketinfo
{
NSLog(@"票的價格是%d,剩余量是%d", [_delegate TicketPrice], [_delegate LeftTicketNum]);
//Person想查詢票的信息,其實是代理幫他查詢的,他只負責獲得結果就行了!
}
@end

Agent.h



#import <Foundation/Foundation.h>

@interface Agent : NSObject

- (int)TicketPrice;
- (int)LeftTicketNum;

@end

Agent.m


#import "Agent.h"

@implementation Agent

- (int)TicketPrice
{
return 200;
}

- (int)LeftTicketNum
{
return 10;
}
@end

main.m


#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
Agent *agent = [[Agent alloc] init];

p.delegate=agent;

[p  Ticketinfo];



}
return 0;
}

運行結果為:


2015-07-26 17:43:27.892 Proxy[1711:451007] 票的價格是200,剩余量是10

看完上面的例子,大概應該對代理模式有些了解了,不過在實際的項目中,不會這樣設計,為什么呢?應為這樣耦合行太高,如果Person這個類離開Agent類,是生存不了的。所以應當優化一下代理模式的設計!

還是接着上面的代碼,進行優化設計。首先再建立一個名為TciketSourceData的protocol,然后進行一系列的剪切,復制,修改等簡單操作,如下:
- 把Agent.h中聲明的方法剪切到TciketSourceData
- 然后,再讓Agent類遵循TciketSourceData協議,修改后的Agent.h現在的樣子是這樣的:


#import <Foundation/Foundation.h>
#import "TicketSourceData.h"
@interface Agent : NSObject <TicketSourceData>


@end

  • 最后,把Person.h中的 @property(retain,nonatomic) Agent * delegate; 修改成 @property(retain,nonatomic) Agent * delegate;

然后運行吧,看看結果應該和我們上次演示的一模一樣吧。

注意

請思考一個問題,利用這種方式,好處在哪里?

  • 首先Person和Agent的耦合性大大降低了!
  • 其次就是,如果Person想找啊其他的Agent002,Agent003做代理也是可以的(只要遵守協議,實現相關協議方法就行)!

另外需要注意的是,ios開發中很多空間,如UITableView,collectionview等都利用的這種代理模式,一般充當代理角色的事Controller!如有興趣,可以自己去研究一下!本篇文章主要介紹這種思想!

好了,ios中的代理模式先介紹到這里,下一篇博客介紹ios中的MVC設計模式,敬請關注!


免責聲明!

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



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