delegate設(shè)計(jì)模式

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ì)步驟

  1. 委托方制定一套協(xié)議(在委托方的.h文件中), 協(xié)議中聲明委托方需要代理方法執(zhí)行的方法(只有方法聲明)
  2. 委托方聲明一個(gè)delegate屬性(assign修飾), 存儲(chǔ)代理方對(duì)象
  3. 代理方需要遵守協(xié)議, 并且對(duì)協(xié)議中的方法進(jìn)行實(shí)現(xiàn)
  4. 將代理方設(shè)置為委托方的代理人(將代理方對(duì)象賦值給委托方對(duì)象的delegate屬性, 進(jìn)行存儲(chǔ))
  5. 委托方在適合的時(shí)機(jī)通知代理方對(duì)象去執(zhí)行相應(yīng)的操作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用場(chǎng)景 當(dāng)某些任務(wù)我們自己不想去實(shí)現(xiàn),想讓別人去實(shí)現(xiàn)的時(shí)候,就可以指定一個(gè)代理,讓代理幫我們?nèi)プ?。我們只需要通?..
    woooooo閱讀 4,742評(píng)論 0 2
  • 序言 最近項(xiàng)目中要用到類似百度外賣app篩選器,于是自己動(dòng)手去實(shí)現(xiàn)。本文將詳盡的利用DataSource和Dele...
    Doramical閱讀 973評(píng)論 1 1
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,604評(píng)論 30 472
  • 在項(xiàng)目中我們經(jīng)常會(huì)用到代理的設(shè)計(jì)模式,這是iOS中一種消息傳遞的方式,也可以通過(guò)這種方式來(lái)傳遞一些參數(shù)。...
    張戰(zhàn)威ican閱讀 904評(píng)論 0 8
  • 你是這樣的人嗎?有一些事情,越在準(zhǔn)備階段越應(yīng)該全力以赴的時(shí)候,反而會(huì)有閑心把節(jié)奏放慢,自己找一些不相關(guān)的事情來(lái)做。...
    花花草草的字閱讀 372評(píng)論 0 0

友情鏈接更多精彩內(nèi)容