黑馬程式設計師_ 利用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可以使用 許多代理 並且 不需要提前知道這個代理具體是什麼 只需要知道它遵守什麼協議就好了。
以上就是一個簡單的代理 模式 雖然簡單 卻有著非常高的效率 以及 低耦合性