1. 程式人生 > >黑馬程式設計師_ 利用oc的協議實現代理模式

黑馬程式設計師_ 利用oc的協議實現代理模式

先說下代理模式是什麼吧

定義: 為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個物件不適合或者不能直接引用另一個物件

而代理物件可以在客戶端和目標物件之間起到中介的作用。

在看過李明傑老師的課程後,我對代理模式有了最初步的理解,雖然還很淺顯 但是也明白了代理模式的

一些作用跟用法。首先使用代理模式可以降低耦合度。大大的增強了程式碼的彈性。

舉個例子,小明想看電影,但是沒時間買票 於是就拜託小強去買票

最簡單的方式就是 建立一個person類(小明) 一個agent類(代理類)

agent類 幫person去買票或者問票價 並且返回訊息 給person

這樣的話person只需要 呼叫 agent就可以獲得自己想要的訊息 非常方便

但是 , 代理並不只是有一個 當person想換另一個代理的時候 就需要換成另一個代理 nextagent

很明顯 這樣會很麻煩 於是我們想到了 使用萬能指標 id型別, 這樣就可以不用每次都改變程式碼

但是這樣做就會出另外的問題,使用id宣告 一個代表著代理的變數時  系統是不“認識”它的 因為

這屬於 執行期的多型  在編譯期無法識別 代理類 nextagent中 的方法。

所以我們需要一個更靈活 低耦合的模式

利用 協議 ,我們可以把協議當做一個 “使用者”與 “代理”之間的中轉站

以下是這個例子的協議

@protocol TicketDelegate <NSObject>

//票價
- (double) ticketPrice;

//剩了多少張票
- (int) leftTicketNumber;


@end

讓代理類遵守協議 並且實現應該實現的方法

@interface Agent : NSObject <TicketDelegate>

@end

這樣我們就有了 一個可以代理協議 跟一個代理

另外,我們可以通過協議 實現更多的代理 


@implementation Person

//想看電影
- (void) buyTicket
{
    //讓代理幫忙買票(詢問票價 剩餘張數)
    double price = [_delegate ticketPrice];
    int number = [_delegate leftTicketNumber];
    NSLog(@"通過代理知:票價 = %f,剩餘票數 = %d",price, number);
}

@endl

在person類中 _delegate這個變數代表著 所使用的代理
在上面已經說了要使用id型別 但id型別必須要遵守協議
才能使_delegate 能夠使用協議中的方法
這樣就解決了上面所說的無法識別(代理中的方法)的問題


@interface Person : NSObject

- (void) buyTicket;

//擁有一個代理
// 必須遵守協議
@property (nonatomic,retain) id<TicketDelegate> delegate;

@end

通過使用協議 person可以使用 許多代理 並且 不需要提前知道這個代理具體是什麼  只需要知道它遵守什麼協議就好了。

以上就是一個簡單的代理 模式 雖然簡單 卻有著非常高的效率 以及 低耦合性