
14701191762149961.jpg
delegate設(shè)計(jì)模式的三要素 - 委托方、代理方、協(xié)議
委托方:委托別人去執(zhí)行某些操作
協(xié)議(Protocol):委托方需要代理方執(zhí)行的操作
代理方:被委托去執(zhí)行某些操作的人(對(duì)象)
協(xié)議, 是通過(guò)網(wǎng)絡(luò), 計(jì)算機(jī)使用者進(jìn)行通訊好, 互相進(jìn)行約定規(guī)定的集合。 兩個(gè)類進(jìn)行通訊用協(xié)議比較方便。
協(xié)議分為非正式協(xié)議和正式協(xié)議, 從寫法上的區(qū)別在于非正式協(xié)議是用@interface 來(lái)定義的, 正式協(xié)議是用@protocol 來(lái)定義的, 雖然正式協(xié)議看上去更正規(guī)一點(diǎn), 語(yǔ)氣上更強(qiáng)烈一些; 要求采用該協(xié)議的類, “必須”實(shí)現(xiàn)協(xié)議中的約定方法。 但是即使號(hào)稱正式協(xié)議, 編譯器在編譯時(shí), 遇到不守規(guī)則的情況, 仍然只是給出警告而已。
// SmallTiger.h
@protocol SmallTiger <NSObject>
@required
- (void) cook;
@optional - (void) washCloths;
@end
// Girl.h
@interface Girl : NSObject
@property (nonatomic, retain) NSString *name;
// 聲明一個(gè)滿足某協(xié)議的代理方
@property (nonatomic, assign) id<SmallTiger>delegate;
- (void) hungry;
- (void) clothesDirty;
@end
// Girl.m
@implementation Girl
- (void) hungry {
NSLog(@"我餓了");
[self.delegate cook];
} - (void) clothesDirty {
NSLog(@"我衣服臟了");
// 判斷我的代理人能否響應(yīng)某一個(gè)方法.
if ([self.delegate respondsToSelector:@selector(washCloths)]) {
[self.delegate washCloths];
} else {
NSLog(@"還讓隔壁老王洗吧");
}
}
@end
// Boy.h
@interface Boy : NSObject<SmallTiger>
@property (nonatomic, retain) NSString *name;
@end
// Boy.m
import "Boy.h"
@implementation Boy
- (void) cook {
NSLog(@"餓了自己做飯去");
}
// 這個(gè)可以不寫的 - (void) washCloths {
NSLog(@"自己洗去, 沒(méi)長(zhǎng)手啊");
}
@end
delegate的設(shè)計(jì)步驟
- 委托方制定一套協(xié)議(在委托方的.h文件中), 協(xié)議中聲明委托方需要代理方法執(zhí)行的方法(只有方法聲明)
- 委托方聲明一個(gè)delegate屬性(assign修飾), 存儲(chǔ)代理方對(duì)象
- 代理方需要遵守協(xié)議, 并且對(duì)協(xié)議中的方法進(jìn)行實(shí)現(xiàn)
- 將代理方設(shè)置為委托方的代理人(將代理方對(duì)象賦值給委托方對(duì)象的delegate屬性, 進(jìn)行存儲(chǔ))
- 委托方在適合的時(shí)機(jī)通知代理方對(duì)象去執(zhí)行相應(yīng)的操作