去年還能買市區(qū)州叠,今朝只能看郊區(qū)
當(dāng)下郊區(qū)不買房棵红,明年得看地下室
出去旅游四五天,回來少個(gè)衛(wèi)生間
曾經(jīng)全款變首付咧栗,現(xiàn)在首付變車庫
買房的時(shí)候由于賣家多, 買家也多
賣家和買家的溝通成本會(huì)很大
就像這個(gè)樣子 :
基于廣大人民群眾的智慧
就誕生了黑中介這個(gè)偉大職業(yè)
所有賣家把房屋信息交給黑中介
所有買家都去黑中介這里去咨詢房屋信息
這樣溝通的效率就會(huì)大大提高
就像這樣 :
中介者模式基本定義 :
面向?qū)ο蟮脑O(shè)計(jì)鼓勵(lì)把行為分散到不同的對象中
這種分散可能導(dǎo)致對象之間的相互關(guān)聯(lián)
更糟糕的情況就導(dǎo)致了對象之間彼此了解并相互操作
中介者模式定義于一個(gè)集中場所
對象間的交互可以在一個(gè)中介者對象中處理
其他對象不必彼此交互
因此減少了他們的依存關(guān)系
這是中介者模式的 UML 圖 :
- Mediator:抽象中介者角色逆甜,定義了同事對象到中介者對象的接口。
- ConcreteMediator:具體中介者角色(也就是房屋黑中介)致板,它從具體的同事對象接收消息交煞,向具體同事發(fā)出命令。
- Colleague:抽象同事角色斟或,定義了中介者對象接口素征,它只知道中介者而不知道其他同事對象。
- ConcreteColleague:具體同事角色(也就是房屋買賣方)缕粹,每個(gè)具體同事類都知道自己在小范圍內(nèi)的行為稚茅。
實(shí)例代碼 :
Demo地址
下面簡單介紹一下實(shí)現(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
然后是抽象同事類, 也就是房屋的買房和賣方的抽象類
他有一些公用屬性
比如客戶名字
賣家房屋價(jià)格
買家資金等等
@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
(具體實(shí)現(xiàn)在 Demo 中, 這里就不贅述)
然后進(jìn)行如下買房流程 :
HXMediatorBlack *mediatorBlack = [[HXMediatorBlack alloc] init];
NSLog(@"我是 : %@", mediatorBlack.name);
HXClientLi *clientLi = [[HXClientLi alloc] init];
NSLog(@"我是 : %@, 我的房屋價(jià)格 : %ld", clientLi.name, clientLi.price);
HXClientZhang *clientZhang = [[HXClientZhang alloc] init];
NSLog(@"我是 : %@, 我的房屋價(jià)格 : %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] 我是 : 炒房老李, 我的房屋價(jià)格 : 5000000
2019-03-05 22:01:57.658947+0800[1066:36865] 我是 : 包租婆老張, 我的房屋價(jià)格 : 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、松散耦合
中介者模式通過把多個(gè)同事對象之間的交互封裝到中介對象里面平斩,從而使得同時(shí)對象之間松散耦合亚享,基本上可以做到互不依賴。這樣一來绘面,同時(shí)對象就可以獨(dú)立的變化和復(fù)用欺税,不再“牽一發(fā)動(dòng)全身”侈沪。
2、集中控制交互
多個(gè)同事對象的交互晚凿,被封裝在中介者對象里面集中管理亭罪,使得這些交互行為發(fā)生變化的時(shí)候,只需要修改中介者就可以了歼秽。
3应役、多對多變?yōu)橐粚Χ?/p>
沒有中介者模式的時(shí)候,同事對象之間的關(guān)系通常是多對多燥筷,引入中介者對象后箩祥,中介者和同事對象的關(guān)系通常變?yōu)殡p向的一對多,這會(huì)讓對象的關(guān)系更容易理解和實(shí)現(xiàn)肆氓。
二 : 中介者模式的弊端 :
1袍祖、難以維護(hù)
中介者模式以中介者內(nèi)部復(fù)雜性代替交互的復(fù)雜性, 中介者的封裝合并了同事對象之間的協(xié)作邏輯, 自身變得可能比任何一個(gè)同事都要復(fù)雜, 難以維護(hù).
三 : 典型應(yīng)用場景 :
1、MVC
MVC中的C(controller)就是一個(gè)中介者谢揪,它的作用就是把M和V隔離開蕉陋,協(xié)調(diào)M和V協(xié)同工作,把M運(yùn)行的結(jié)果和V代表的視圖融合成一個(gè)前端可以展示的頁面拨扶,減少M(fèi)和V的依賴關(guān)系凳鬓。
2、UINavigationController
iOS中的UINavigationController就是一個(gè)中介者屈雄,他來管理視圖的跳轉(zhuǎn)村视。一般情況下官套,一個(gè)頁面便對應(yīng)代碼中的一個(gè)VC酒奶,而一個(gè)中等規(guī)模的軟件至少會(huì)有幾十個(gè)的頁面,對應(yīng)的就是幾十個(gè)VC奶赔。要管理這些VC之間的關(guān)系是一件非常繁瑣的事情惋嚎,每當(dāng)一個(gè)VC要跳轉(zhuǎn)到另外個(gè)VC,我們需要包含新的VC的頭文件站刑,于是有的起銜接作用的VC中包含了大量的其他VC的頭文件另伍。使用中介者模式可以非常好地去解決這個(gè)問題。
感謝閱讀
你的點(diǎn)贊是我寫作的唯一動(dòng)力