iOS 設(shè)計(jì)模式的應(yīng)用 ⑨ 中介者模式

前言

????在 App 中坐桩,我們常常遇到多個(gè) UI 元素之間相互依賴尺棋,比如當(dāng)列表框中的某一項(xiàng)被選中時(shí),UILabel 會(huì)被更新為列表框中選定的值绵跷。又或者當(dāng)用戶在文本框輸入了新的值時(shí)陡鹃,需要將這個(gè)新的值加入到列表框的列表中。當(dāng)更多的 UI 元素參與到這一錯(cuò)綜復(fù)雜的關(guān)系之中時(shí)抖坪,情況可能變得難以控制萍鲸,元素之間需要彼此了解并相互操作。又或者當(dāng)從一個(gè)頁面跳轉(zhuǎn)到另一個(gè)頁面時(shí)擦俐,需要了解目標(biāo)頁面所需參數(shù)等等脊阴。這個(gè)時(shí)候需要有一個(gè)集中化的角色組織各種 UI 元素在同一個(gè)語境下進(jìn)行交互,稱之為中介者(Mediator)蚯瞧。

什么是中介者模式

????在面向?qū)ο蟮脑O(shè)計(jì)中鼓勵(lì)把行為分散到不同對(duì)象中嘿期,這種分散可能導(dǎo)致對(duì)象之間的互相聯(lián)系。在最糟糕的情況下埋合,所有對(duì)象都彼此了解并相互操作备徐。雖然把行為分散到不同對(duì)象增強(qiáng)了可復(fù)用性,但是增加的相互關(guān)聯(lián)又減少了獲得的益處甚颂。在這種情況下就需要中介者模式蜜猾。中介者模式提供了一個(gè)中介類作為集中的場(chǎng)所,用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互振诬,中介者使各對(duì)象不需要顯式地相互引用蹭睡,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互赶么。

中介者模式的類圖.png

什么時(shí)候使用中介者模式

  • 對(duì)象之間的交互雖然定義明確但是非常復(fù)雜肩豁,導(dǎo)致一組對(duì)象彼此相互依賴,形成了網(wǎng)狀結(jié)構(gòu)。若一個(gè)對(duì)象發(fā)生改變清钥,我們也需要跟蹤與之相關(guān)聯(lián)的對(duì)象琼锋,同時(shí)做出相應(yīng)的處理。
  • 對(duì)象引用了許多其它對(duì)象并與其通訊祟昭,導(dǎo)致對(duì)象難以復(fù)用
  • 想要定制一個(gè)分布在多個(gè)類中的邏輯或行為缕坎,又不想生成太多子類。

中介者模式的優(yōu)缺點(diǎn)

中介者模式的優(yōu)點(diǎn)

  1. 降低了類的復(fù)雜度从橘,將一對(duì)多轉(zhuǎn)化成了一對(duì)一念赶。
  2. 各個(gè)類之間的解耦。
  3. 符合迪米特原則恰力。(一個(gè)類對(duì)于其他類知道的越少越好)

中介者模式的缺點(diǎn)

隨著系統(tǒng)規(guī)模的增大叉谜,中介者會(huì)越來越龐大,變得復(fù)雜難以維護(hù)踩萎。

Cocoa 中的中介者模式

????UIViewController是一個(gè)抽象類停局,可以對(duì)其進(jìn)行子類化以管理特定視圖。UIKit 框架還提供了UIViewController用于管理導(dǎo)航欄和工具欄對(duì)象的子類:UINavigationControllerUITabBarController. 一個(gè) UITabController 可以管理多個(gè) UINavigationController香府,而這些UINavigationController又可以管理一個(gè)或多個(gè) UIViewController董栽,每個(gè)控制器都有其關(guān)聯(lián)的視圖對(duì)象。除了管理視圖(包括覆蓋視圖)之外企孩,視圖控制器還指定導(dǎo)航欄中顯示的按鈕和標(biāo)題锭碳。

uictlr_object_diagram.jpeg

中介者模式的實(shí)現(xiàn)

運(yùn)行時(shí)中介者模式的對(duì)象結(jié)構(gòu).png
  1. 定義中介者和對(duì)象遵守的協(xié)議

    @protocol Mediator;
    @protocol Colleague <NSObject>
    @property (nonatomic, strong) id <Mediator> mediator;
    - (void)receive;
    - (void)send;
    @end
      
    @protocol Mediator <NSObject>
    - (void)register:(id<Colleague>)colleague;
    - (void)relay:(id<Colleague>)cl;
    @end
    
    
  2. 實(shí)現(xiàn)其方法

    @interface ConcreteMediator : NSObject<Mediator>
    
    @end
    @interface ConcreteMediator ()
    @property (nonatomic, strong) NSMutableArray <id<Colleague>> *colleagues;
    @end
    @implementation ConcreteMediator
    - (NSMutableArray<id<Colleague>> *)colleagues{
        if (!_colleagues) {
            _colleagues = [NSMutableArray array];
        }
        return _colleagues;
    }
    - (void)register:(id<Colleague>)colleague{
        if ([colleague conformsToProtocol:@protocol(Colleague) ]){
            if(![self.colleagues containsObject:colleague]){
                [self.colleagues addObject:colleague];
                [colleague setMediator:self];
            }
        }
    }
    - (void)relay:(id<Colleague>)cl{
        for (id <Colleague> colleague  in self.colleagues) {
            if (![colleague isEqual:cl]) {
                [colleague  receive];
            }
        }
    }
    
    @end
    @interface ConcreteColleague1 : NSObject<Colleague>
    @end
    @implementation ConcreteColleague1
    
    @synthesize mediator;
    
    - (void)receive {
        NSLog(@"對(duì)象1收到消息");
    }
    
    - (void)send {
        NSLog(@"對(duì)象1發(fā)送消息");
        if (self.mediator) {
            [self.mediator relay:self];
        }
    }
    
    @end
    
    @interface ConcreteColleague2 : NSObject<Colleague>
    @end
    @implementation ConcreteColleague2
    @synthesize mediator;
    - (void)receive {
        NSLog(@"對(duì)象2收到消息");
    }
    - (void)send {
        NSLog(@"對(duì)象2發(fā)送消息");
        if (self.mediator) {
            [self.mediator relay:self];
        }
    }
    @end
    
  3. 最終調(diào)用對(duì)象方法時(shí),會(huì)通過中介者進(jìn)行管理勿璃、轉(zhuǎn)發(fā)擒抛。

    ConcreteMediator *mediator = [ConcreteMediator new];
    ConcreteColleague1 *colleague1 = [[ConcreteColleague1 alloc] init];
    ConcreteColleague2 *colleague2 = [[ConcreteColleague2 alloc] init];
    
    [mediator register:colleague1];
    [mediator register:colleague2];
    [colleague1 send];
    [colleague2 send];
    

總結(jié)

????雖然對(duì)于處理應(yīng)用程序行為分散到不同對(duì)象并且對(duì)象相互依存的情況,中介者模式非常有用补疑,但是應(yīng)當(dāng)避免讓中介者類過于龐大而難以維護(hù)歧沪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市莲组,隨后出現(xiàn)的幾起案子诊胞,更是在濱河造成了極大的恐慌,老刑警劉巖锹杈,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵孤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嬉橙,警方通過查閱死者的電腦和手機(jī)早直,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來市框,“玉大人,你說我怎么就攤上這事糕韧》阏瘢” “怎么了喻圃?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粪滤。 經(jīng)常有香客問我斧拍,道長(zhǎng),這世上最難降的妖魔是什么杖小? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任肆汹,我火速辦了婚禮,結(jié)果婚禮上予权,老公的妹妹穿的比我還像新娘昂勉。我一直安慰自己,他們只是感情好扫腺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布岗照。 她就那樣靜靜地躺著,像睡著了一般笆环。 火紅的嫁衣襯著肌膚如雪攒至。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天躁劣,我揣著相機(jī)與錄音迫吐,去河邊找鬼。 笑死账忘,一個(gè)胖子當(dāng)著我的面吹牛志膀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闪萄,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼梧却,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了败去?” 一聲冷哼從身側(cè)響起放航,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圆裕,沒想到半個(gè)月后广鳍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吓妆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年赊时,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片行拢。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祖秒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竭缝,我是刑警寧澤房维,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站抬纸,受9級(jí)特大地震影響咙俩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湿故,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一阿趁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坛猪,春花似錦脖阵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躁锁,卻和暖如春纷铣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背战转。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工搜立, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槐秧。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓啄踊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親刁标。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颠通,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 我們平時(shí)寫代碼的過程,一個(gè)類必然會(huì)與其他類產(chǎn)生依賴關(guān)系膀懈,如果這種依賴關(guān)系如網(wǎng)狀般錯(cuò)綜復(fù)雜顿锰,那么必然會(huì)影響我們的代碼...
    不將就更好的你閱讀 449評(píng)論 0 4
  • 個(gè)人學(xué)習(xí)筆記分享,當(dāng)前能力有限启搂,請(qǐng)勿貶低硼控,菜鳥互學(xué),大佬繞道如有勘誤胳赌,歡迎指出和討論牢撼,本文后期也會(huì)進(jìn)行修正和補(bǔ)充 ...
    Echo_YeZ閱讀 307評(píng)論 0 0
  • 何為中介者模式? 面向?qū)ο蟮脑O(shè)計(jì)鼓勵(lì)把行為分散到不同對(duì)象中疑苫,這種分散可能導(dǎo)致對(duì)象之間的相互關(guān)聯(lián)熏版。在最糟糕的情況下纷责,...
    泥孩兒0107閱讀 332評(píng)論 0 0
  • 一、特性與定義 1. 定義 定義一個(gè)中介對(duì)象來封裝一系列對(duì)象之間的交互纳决,使原有對(duì)象之間耦合松散碰逸,且可以獨(dú)立地改變他...
    Vic_is_new_Here閱讀 1,658評(píng)論 0 5
  • 原文傳送門 1 介紹 中介者模式又稱為調(diào)停者模式乡小,它是一種對(duì)象行為型模式阔加。 1.1 什么是中介者模式 用一個(gè)中介對(duì)...
    dd299閱讀 102評(píng)論 0 1