iOS 設(shè)計(jì)模式 - 中介者模式

概要

說(shuō)到設(shè)計(jì)模式爱沟,可能大多數(shù)程序員的腦海里第一時(shí)間飄過(guò)的是下面的一系列文字:?jiǎn)卫J健⒋砟J酱冶场⒂^察者模式呼伸、工廠方法模式等等,以上幾個(gè)是平時(shí)用得最多的也是大家耳熟能詳?shù)脑O(shè)計(jì)模式钝尸。當(dāng)然括享,設(shè)計(jì)模式并不僅限于這幾個(gè),還有更多珍促,諸如:適配器模式铃辖、組合模式、裝飾模式猪叙、策略模式娇斩、命令模式、責(zé)任鏈模式穴翩、中介者模式等等犬第,這些設(shè)計(jì)模式有的會(huì)很好的應(yīng)用在項(xiàng)目中,也有的用到的概率很低芒帕。接下來(lái)歉嗓,就介紹一下其中比較簡(jiǎn)單的一個(gè) —— 中介者模式。


簡(jiǎn)介

<p>

何為中介者模式背蟆?

中介者模式是用一個(gè)對(duì)象來(lái)封裝一組或者一系列對(duì)象的交互方式鉴分,使對(duì)象間的交互可以在一個(gè)中介者對(duì)象中處理哮幢,從而使各對(duì)象耦合松散,而且可以獨(dú)立的改變它們之間的交互志珍。中介者就好比站在十字路口的交通警察家浇,如果改變十字路口的交通模式,只需要把新的交通策略給交通警察即可碴裙,而不是路上的所有車輛钢悲,這樣才能更好的協(xié)調(diào)來(lái)自不同方向車輛。

中介者模式有什么用舔株?

說(shuō)到中介者模式的作用莺琳,其實(shí)從上述的定義中便可以知道其大體用處,無(wú)非是用來(lái)集中的管理一組對(duì)象的交互载慈,從而降低各個(gè)對(duì)象間的耦合度惭等。當(dāng)一組對(duì)象彼此間的依賴程度較高,導(dǎo)致難以復(fù)用時(shí)办铡,便可以采用該模式辞做。中介者,在應(yīng)用程序整個(gè)生命周期應(yīng)該只有一個(gè)實(shí)例寡具,否則將無(wú)法管理多個(gè)對(duì)象間的交互秤茅,所以要使用單例實(shí)現(xiàn)。


使用場(chǎng)景

有這樣的一個(gè)需求童叠,在一個(gè)根視圖控制器中(暫且稱之為rootVC)框喳,有三個(gè)button,點(diǎn)擊不同的button都會(huì)跳到對(duì)應(yīng)的視圖控制器中厦坛,分別是firstVC五垮、secondVC、thirdVC杜秸。也許你會(huì)說(shuō)放仗,直接在rootVC中寫跳轉(zhuǎn)不是更簡(jiǎn)單嗎?在視圖控制器數(shù)量很少的情況下撬碟,這樣的確比較簡(jiǎn)單直接诞挨,但是當(dāng)后期試圖控制器數(shù)量增多時(shí),你會(huì)發(fā)現(xiàn)rootVC中的代碼量變得復(fù)雜難以維護(hù)小作,所以需要一個(gè)中介者來(lái)協(xié)調(diào)他們的之間交互亭姥,從而降低耦合度、提高代碼的維護(hù)性顾稀。代碼如下:
1达罗、rootVC中的button點(diǎn)擊方法:

- (IBAction)clickedFirstAction:(UIButton *)sender {
    [self coordinateToDifferentControllerWith:sender.tag];
}

- (IBAction)clickedSecondAction:(UIButton *)sender {
    [self coordinateToDifferentControllerWith:sender.tag];
}

- (IBAction)clickedThirdAction:(UIButton *)sender {
    [self coordinateToDifferentControllerWith:sender.tag];
}

- (void)coordinateToDifferentControllerWith:(NSInteger)tag {
    [[MediatorManager sharedManager] coordinateViewControllers:@(tag)];
}

2、中介者(MediatorManager)中要保持一個(gè)對(duì)rootVC的引用,.h文件代碼如下:

#import <Foundation/Foundation.h>

@class ViewController, UIViewController;

typedef NS_ENUM(NSInteger, ButtonTag) {
    ButtonTagFirstVC  = 1,
    ButtonTagSecondVC = 2,
    ButtonTagThirdVC  = 3,
};

@interface MediatorManager : NSObject

@property (nonatomic, strong, readonly) ViewController *rootVC;
@property (nonatomic, strong, readonly) UIViewController *activeVC;

+ (MediatorManager *)sharedManager;

- (void)coordinateViewControllers:(id)tagValue;

@end

3粮揉、MediatorManager的.m文件代碼:


#import "MediatorManager.h"
#import "ViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"

@implementation MediatorManager

+ (MediatorManager *)sharedManager {
    static MediatorManager *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

- (void)coordinateViewControllers:(id)tagValue {
    if ([tagValue isKindOfClass:[NSNumber class]]) {
        switch ([tagValue integerValue]) {
            case ButtonTagFirstVC:
            {
                FirstViewController *firstVC = [[FirstViewController alloc] init];
                _activeVC = firstVC;
                [self.rootVC.navigationController pushViewController:firstVC animated:YES];
            }
                break;
            case ButtonTagSecondVC:
            {
                SecondViewController *secondVC = [[SecondViewController alloc] init];
                _activeVC = secondVC;
                [self.rootVC.navigationController pushViewController:secondVC animated:YES];
            }
                break;
            case ButtonTagThirdVC:
            {
                ThirdViewController *thirdVC = [[ThirdViewController alloc] init];
                _activeVC = thirdVC;
                [self.rootVC.navigationController pushViewController:thirdVC animated:YES];
            }
                break;
                
            default:
                _activeVC = self.rootVC;
                [self.rootVC.navigationController popViewControllerAnimated:YES];
                break;
        }
    }
}

@end

注意:在coordinateViewControllers方法里巡李,用的是switch語(yǔ)句來(lái)判斷各個(gè)試圖控制的跳轉(zhuǎn),此方法并不是很好扶认,如果視圖控制器的數(shù)量增多時(shí)侨拦,這樣顯然不好,采用策略模式會(huì)更好一些辐宾。至于策略模式狱从,會(huì)在以后的文章中作介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叠纹,一起剝皮案震驚了整個(gè)濱河市季研,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌誉察,老刑警劉巖与涡,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異持偏,居然都是意外死亡驼卖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鸿秆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酌畜,“玉大人,你說(shuō)我怎么就攤上這事谬莹¢莸欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵附帽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我井誉,道長(zhǎng)蕉扮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任颗圣,我火速辦了婚禮喳钟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘在岂。我一直安慰自己奔则,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蔽午。 她就那樣靜靜地躺著易茬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抽莱,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天范抓,我揣著相機(jī)與錄音,去河邊找鬼食铐。 笑死匕垫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虐呻。 我是一名探鬼主播象泵,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斟叼!你這毒婦竟也來(lái)了单芜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤犁柜,失蹤者是張志新(化名)和其女友劉穎洲鸠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體馋缅,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扒腕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萤悴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾腰。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖覆履,靈堂內(nèi)的尸體忽然破棺而出蹋盆,到底是詐尸還是另有隱情,我是刑警寧澤硝全,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布栖雾,位于F島的核電站,受9級(jí)特大地震影響伟众,放射性物質(zhì)發(fā)生泄漏析藕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一凳厢、第九天 我趴在偏房一處隱蔽的房頂上張望账胧。 院中可真熱鬧,春花似錦先紫、人聲如沸治泥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)居夹。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吮播,已是汗流浹背变屁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留意狠,地道東北人粟关。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像环戈,于是被迫代替她去往敵國(guó)和親闷板。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 1 場(chǎng)景問(wèn)題# 1.1 如果沒(méi)有主板## 大家都知道院塞,電腦里面各個(gè)配件之間的交互遮晚,主要是通過(guò)主板來(lái)完成的(事實(shí)上主...
    七寸知架構(gòu)閱讀 2,170評(píng)論 0 56
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情拦止,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式县遣。簡(jiǎn)單...
    舟漁行舟閱讀 7,750評(píng)論 2 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 設(shè)計(jì)模式基本原則 開(kāi)放-封閉原則(OCP),是說(shuō)軟件實(shí)體(類汹族、模塊萧求、函數(shù)等等)應(yīng)該可以拓展,但是不可修改顶瞒。開(kāi)-閉原...
    西山薄涼閱讀 3,792評(píng)論 3 14
  • 文/南山 學(xué)生一模考試坑资,明天不用上課耗帕,沒(méi)了作業(yè),暫時(shí)也不用備課盐茎。偶的閑暇兴垦,先是有點(diǎn)小開(kāi)心,終于可以清閑一會(huì)了字柠,中午...
    南山居士無(wú)二閱讀 1,323評(píng)論 0 0