iOS 中介者模式, 源于生活的藝術(shù) ── 黑中介

去年還能買市區(qū),今朝只能看郊區(qū)
當(dāng)下郊區(qū)不買房,明年得看地下室
出去旅游四五天,回來少個衛(wèi)生間
曾經(jīng)全款變首付,現(xiàn)在首付變車庫


買房的時候由于賣家多, 買家也多
賣家和買家的溝通成本會很大
就像這個樣子 :

沒有房屋中介

基于廣大人民群眾的智慧
就誕生了黑中介這個偉大職業(yè)
所有賣家把房屋信息交給黑中介
所有買家都去黑中介這里去咨詢房屋信息
這樣溝通的效率就會大大提高
就像這樣 :

加入房屋中介

中介者模式基本定義 :

面向?qū)ο蟮脑O(shè)計鼓勵把行為分散到不同的對象中
這種分散可能導(dǎo)致對象之間的相互關(guān)聯(lián)
更糟糕的情況就導(dǎo)致了對象之間彼此了解并相互操作
中介者模式定義于一個集中場所
對象間的交互可以在一個中介者對象中處理
其他對象不必彼此交互
因此減少了他們的依存關(guān)系
這是中介者模式的 UML 圖 :

UML
  • Mediator:抽象中介者角色,定義了同事對象到中介者對象的接口。
  • ConcreteMediator:具體中介者角色(也就是房屋黑中介),它從具體的同事對象接收消息,向具體同事發(fā)出命令。
  • Colleague:抽象同事角色,定義了中介者對象接口,它只知道中介者而不知道其他同事對象。
  • ConcreteColleague:具體同事角色(也就是房屋買賣方),每個具體同事類都知道自己在小范圍內(nèi)的行為。

實例代碼 :

Demo地址
下面簡單介紹一下實現(xiàn)過程 :
首先是抽象中介者類, 也就是房屋黑中介的抽象類
他有中介者所共有的一些特性
比如黑中介的名稱
給賣房客戶提供房屋信息登記功能
還有給買房用戶提供房屋信息功能

@interface HXAbstractMediator : NSObject

/** 中介名字 */
@property (nonatomic,copy) NSString *name;

/** 所有客戶 */
@property (nonatomic,strong) NSMutableArray<HXAbstractClient *> *clients;

/** 添加客戶資料 */
- (void)addClintProfile:(HXAbstractClient *)client;

/** 我要買房 */
- (NSArray<HXAbstractClient *> *)screenHouseForBuyer:(HXAbstractClient *)buyer;

@end

然后是抽象同事類, 也就是房屋的買房和賣方的抽象類
他有一些公用屬性
比如客戶名字
賣家房屋價格
買家資金等等

@interface HXAbstractClient : NSObject

/** 客戶名字 */
@property (nonatomic,copy) NSString *name;

/** 如果作為買家, 我又多少錢 */
@property (nonatomic,assign) NSInteger money;

/** 如果作為賣家, 我得房子值多少錢 */
@property (nonatomic,assign) NSInteger price;

@end

然后
繼承中介抽象類 創(chuàng)建黑中介房屋中介公司 HXMediatorBlack
繼承抽象同事類 創(chuàng)建賣方老張 HXClientZhang
繼承抽象同事類 創(chuàng)建賣方老李 HXClientLi
繼承抽象同事類 創(chuàng)建買房小王 HXClientWang
(具體實現(xiàn)在 Demo 中, 這里就不贅述)
然后進行如下買房流程 :

        HXMediatorBlack *mediatorBlack = [[HXMediatorBlack alloc] init];
        NSLog(@"我是 : %@", mediatorBlack.name);
        
        HXClientLi *clientLi = [[HXClientLi alloc] init];
        NSLog(@"我是 : %@, 我的房屋價格 : %ld", clientLi.name, clientLi.price);
        
        HXClientZhang *clientZhang = [[HXClientZhang alloc] init];
        NSLog(@"我是 : %@, 我的房屋價格 : %ld", clientZhang.name, clientZhang.price);
        
        HXClientWang *clientWang = [[HXClientWang alloc] init];
        NSLog(@"我是 : %@, 我有多少錢 : %ld", clientWang.name, clientWang.money);
        
        // 賣家聯(lián)系黑中介要賣房, 黑中介記錄賣家信息
        [mediatorBlack addClintProfile:clientLi];
        [mediatorBlack addClintProfile:clientZhang];
        
        // 小王找到黑中介要買房, 黑中介看看小王能買得起誰的房子
        NSArray<HXAbstractClient *> *array = [mediatorBlack screenHouseForBuyer:clientWang];
        NSLog(@"最終小王能買得起 %ld 套房子", array.count);

打印結(jié)果就是 :

2019-03-05 22:01:57.658407+0800[1066:36865] 我是 : 黑中介房屋中介公司, 不黑不要錢
2019-03-05 22:01:57.658587+0800[1066:36865] 我是 : 炒房老李, 我的房屋價格 : 5000000
2019-03-05 22:01:57.658947+0800[1066:36865] 我是 : 包租婆老張, 我的房屋價格 : 4800000
2019-03-05 22:01:57.659157+0800[1066:36865] 我是 : 苦逼的程序員小王, 我有多少錢 : 28
2019-03-05 22:01:57.659364+0800[1066:36865] 最終小王能買得起 0 套房子

這樣小王芳芳不需要分別找老張和老李
老張老李賣房也不用都去找小王
大家都很省心嘛


總結(jié) :

一 : 中介者模式的優(yōu)勢 :

1、松散耦合

中介者模式通過把多個同事對象之間的交互封裝到中介對象里面,從而使得同時對象之間松散耦合,基本上可以做到互不依賴。這樣一來,同時對象就可以獨立的變化和復(fù)用,不再“牽一發(fā)動全身”。

2、集中控制交互

多個同事對象的交互,被封裝在中介者對象里面集中管理,使得這些交互行為發(fā)生變化的時候,只需要修改中介者就可以了。

3、多對多變?yōu)橐粚Χ?/p>

沒有中介者模式的時候,同事對象之間的關(guān)系通常是多對多,引入中介者對象后,中介者和同事對象的關(guān)系通常變?yōu)殡p向的一對多,這會讓對象的關(guān)系更容易理解和實現(xiàn)。

二 : 中介者模式的弊端 :

1、難以維護

中介者模式以中介者內(nèi)部復(fù)雜性代替交互的復(fù)雜性, 中介者的封裝合并了同事對象之間的協(xié)作邏輯, 自身變得可能比任何一個同事都要復(fù)雜, 難以維護.

三 : 典型應(yīng)用場景 :

1、MVC

MVC中的C(controller)就是一個中介者,它的作用就是把M和V隔離開,協(xié)調(diào)M和V協(xié)同工作,把M運行的結(jié)果和V代表的視圖融合成一個前端可以展示的頁面,減少M和V的依賴關(guān)系。

2、UINavigationController

iOS中的UINavigationController就是一個中介者,他來管理視圖的跳轉(zhuǎn)。一般情況下,一個頁面便對應(yīng)代碼中的一個VC,而一個中等規(guī)模的軟件至少會有幾十個的頁面,對應(yīng)的就是幾十個VC。要管理這些VC之間的關(guān)系是一件非常繁瑣的事情,每當(dāng)一個VC要跳轉(zhuǎn)到另外個VC,我們需要包含新的VC的頭文件,于是有的起銜接作用的VC中包含了大量的其他VC的頭文件。使用中介者模式可以非常好地去解決這個問題。

感謝閱讀
你的點贊是我寫作的唯一動力


享元模式
工廠模式
建造者模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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