去年還能買市區(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 圖 :

- 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的頭文件。使用中介者模式可以非常好地去解決這個問題。
感謝閱讀
你的點贊是我寫作的唯一動力