Object-C篇-設計模式之代理
一 : 代理設計模式簡述
自己做不了的事情,教給別人幫你完成,並且,完成的那個結果返還給你.這個就是代理,舉一個簡單的小例子 : 假如足球明星 C羅
去參加一些商務活動,但是 C羅
所具有的能力只有 足球踢得好
, 帥
, 有魅力
這寫,不會管安排酒店,安排飛機,安排安保,安排活動程序這些東西.這時候需要一個代理人,幫助 C羅
去完成這些瑣事的東西,接下來看看,如何用程式碼實現這一場景.
二 : 代理設計模式應用場景
- 當物件A發生了一些行為,想告知物件B(讓物件B成為物件A的代理物件)
- 物件B想監聽物件A的一些行為(讓物件B成為物件A的代理物件)
- 當物件A無法處理某些行為的時候,想讓物件B幫忙處理(讓物件B成為物件A的代理物件)
三 : 設計並書寫C羅的代理
定義C羅最近想做的事情
@interface CRonaldo : NSObject //relax -(void)releax; //電視演出 -(void)TVShow; @end
@implementation CRonaldo -(void)TVShow{ NSLog(@"C羅進行節目錄制"); } -(void)releax{ NSLog(@"C羅在夏威夷海灘和妻子吹風"); } @end
需要一個人來幫助自己去安排一下出演,和假期但是 C羅
身份在那擺著呢,這種事情不能自己做,這裡要安排一個助手也就是代理在這裡.
@interface Assistant : NSObject @end
定義一個協議,那種人才有資格當這個助手呢,簡單一,具有安排演出和安排假期能力的人能當上這個助手,定義一個協議,協議內容為安排假期和安排演出
@protocol AssistantProtocol <NSObject> //安排演出 -(void)playTvShow; //安排假期 -(void)playHoliday; @end
讓我們助手遵守這些協議
#import "AssistantProtocol.h" @interface Assistant : NSObject<AssistantProtocol> @end
@implementation Assistant -(void)playTvShow{ NSLog(@"預定飛機票"); NSLog(@"排除車子"); } - (void)playHoliday{ NSLog(@"安排假期時間"); NSLog(@"準備旅行用品,和居住酒店") }
助手的條件,現在已經搞定了,我們現在去給 C羅
安排這麼一個人來做這些事情
@interface CRonaldo : NSObject //relax -(void)releax; //電視演出 -(void)TVShow; @property(nonatomic,weak)id<AssistantProtocol> assisDegate; @end
#import "CRonaldo.h" @implementation CRonaldo -(void)TVShow{ if ([self.assisDegate respondsToSelector:@selector(playTvShow)] ) { [self.assisDegate playTvShow]; } NSLog(@"C羅進行節目錄制"); } -(void)releax{ if ([self.assisDegate respondsToSelector:@selector(playHoliday)] ) { [self.assisDegate playHoliday]; } NSLog(@"C羅在夏威夷海灘和妻子吹風"); }
到現在為止呢,安排等瑣碎的小事就算安排出去了,畢竟大明星都有自己的助理,接下來測試一下
//建立助手一位 Assistant *assis = [[Assistant alloc]init]; //請出我們的球星C羅 CRonaldo *ron = [[CRonaldo alloc]init]; //給C羅安排助手 ron.assisDegate = assis; //協助C羅完成 度假 和 演出 [ron TVShow]; [ron releax];
列印結果

列印結果
四 : 實際開發中的代理
-
一般情況下, 當前協議屬於誰, 我們就將協議定義到誰的標頭檔案中
-
協議的名稱一般以它屬於的那個類的類名開頭, 後面跟上protocol或者delegate
-
協議中的方法名稱一般以協議的名稱protocol之前的作為開頭
-
一般情況下協議中的方法會將觸發該協議的物件傳遞出去
-
一般情況下一個類中的代理屬於的名稱叫做 delegate
我們根據這些小小的建議在來修改一下 C羅
與 助手
的書寫方式
#import <Foundation/Foundation.h> @protocol AssistantProtocol <NSObject>; //安排演出 -(void)playTvShow; //安排假期 -(void)playHoliday; @end @interface CRonaldo : NSObject //relax -(void)releax; //電視演出 -(void)TVShow; @property(nonatomic,weak)id<AssistantProtocol> assisDegate; @end