代理模式介紹:
代理模式官方定義是:為其他對象提供一種代理以控制對這個對象的訪問。
所謂代理,就是一個人或者一個機構代表另一個人或者另一個機構采取行動。
在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可
以在客戶端和目標對象之間起到中介的作用。
舉個好理解的例子來說明:
一個人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設計模式,敬請關注!