天天看點

Objective C--代理模式

 今天,想和大家分享一下代理模式。首先呢,我想先用一句話概括一下代理模式。

 代理模式(Proxy),為其他對象提供一種代理以控制對這個對象的通路。

 那麼,代理模式一般都在什麼情況下使用呢?大體可以分為以下四種:

  1. 遠端代理,也就是為一個對象在不同的位址空間提供局部代表。這樣可以隐藏一個對象存在于不同位址空間的事實。
  2. 虛拟代理,是根據需要建立開銷很大的對象。通過它來存放執行個體化需要很長時間的真實對象。
  3. 安全代理,用來控制真實對象通路時的權限。
  4. 智能指針,是指當調用真實的對象時,代理處理另外一些事。

 其實看起來用途還是蠻多的,不過說實話,基本的結構并不複雜哦!我是說最最基本的結構看起來并不複雜哦,下面可以看一下類的結構圖:

Objective C--代理模式

 下面簡單介紹一下圖中提到的幾個類型,Client不用多說,顧名思義就是所提供服務的目标對象,Subject類型是RealSubject和Proxy的公共接口,同理也就是說,Proxy類型和RealSubject類型都繼承自Subject類型,通過Proxy類型來引用RealSubject類型,以達到隐藏RealSubject類型的目的,進而實作對RealSubject類型的代理功能。

 下面還是按老套路,把用Objective C實作的簡單代碼給大家做一個展示。

=============================================

  • Subject類接口
1 2 3 4 5

#import <Foundation/Foundation.h>

@interface

Subject:

NSObject

-(

void

)Request;

@end

  • Subject類實作
1 2 3 4 5 6 7

#import "Subject.h"

@implementation

Subject

-(

void

)Request{

return

;

}

@end

  • RealSubject類接口
1 2 3 4

#import "Subject.h"

@interface

RealSubject :Subject

@end

  • RealSubject類實作
1 2 3 4 5 6 7 8

#import "RealSubject.h"

@implementation

RealSubject

-(

void

)Request{

NSLog

(@

"我是Request,真實的請求"

);

return

;

}

@end

  • Proxy類接口
1 2 3 4 5 6 7

#import "Subject.h"

#import "RealSubject.h"

@interface

Proxy:Subject{

@private

RealSubject *realSubject;

}

@end

  • Proxy類實作
1 2 3 4 5 6 7 8 9 10

#import "Proxy.h"

@implementation

Proxy

-(

void

)Request{

if

(realSubject==

nil

)

realSubject= [[RealSubject alloc]init];

[realSubject Request];

return

;

}

@end

  • Client端(Main()方法調用)
1 2 3 4 5 6 7 8 9 10 11

#import <Foundation/Foundation.h>

#import "Proxy.h"

int

main (

int

argc,

const

char

*argv[])

{

@autoreleasepool

{      

Proxy *proxy = [[Proxy alloc]init];

[proxy Request];

}

return

0;

}

  好啦,完工!簡單吧!呵呵!一共也沒幾行代碼哦,關鍵是思想、思路。這才是精髓啊,關鍵不在模式本身的套路,關鍵是實作上的方法思路,這才是重點啊。關于這一點還是需要細細揣摩的啊!

繼續閱讀