? ? ? ? ?近兩年,中國房價可謂瘋狂至極,買賣房產獲利非常可觀,房地產中介行業也因此生機蓬勃。大街上的“xx地產”隨處可見,在街上發傳單追你一條街推銷房子的中介人屢見不鮮,當然也沒少接到來自中介的騷擾電話咯。大家對中介這種角色估計也不陌生,所以今天的設計模式就以這個房地產中介作為故事背景吧!
從無中介.jpg可以看出,要是沒有中介的存在,買賣家之間的交流是如此困難且復雜。買家買房要跑去找賣家,賣家買房又得跑去找買家。如果現實真的如此,估計買賣家早就拍桌子說:“老子xx不買(賣)了!”如此反復,房地產業還可能像現在這樣撐起國家經濟嗎?
好了,有中介的接入,一切都變得so easy了!買家要買房,直接到中介看房源,賣家賣房,直接委托中介推銷,買賣家通過中介相互取得聯系,進行溝通,最后達成買賣共識。呃..不瞎扯了,馬上進入的主題!!!!
一、基本定義
定義:用一個中介者對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使耦合松散,而且可以獨立地改變它們之間的交互。
在中介者模式的定義中,各個類都被看作兩個大類,分別是中介者類和同事類。
這句官方的定義看起來很抽象吧,要不試試結合我們的故事背景思考思考~這段定義可以分為4段來理解(中介者類=中介人,同事類=買賣家):
①用一個中介者對象封裝一系列的對象交互——這就好比中介人擁有買賣家雙方的聯系方式,在買賣過程中向買賣家提供最新的消息和有效的幫助等等
②中介者使各對象不需要顯示地相互作用——買賣家雙方都會把意愿交待給中介人,透過中介人把意愿傳達給對方,而不需要買賣家之間直接通電話聯系
③從而使耦合松散——買賣家之間的聯系從“買家<——>買家”變成“買家<——>中介<——>買家”,買賣家的直接聯系斷開,中介成為買賣雙方聯系的橋梁
④可以獨立地改變它們之間的交互——中介告訴賣家房價升了,賣家就做出升價的決定看到這里,有些童鞋應該已經從一臉懵逼進化到“原(san)來(lian)如(meng)此(bi)”。咳咳.....馬上進入下一環節let go!!!
二、UML
馬上進入第二環節,請認真看UML圖 * 3 (重要事情說三遍!!!)
三、實例代碼
AbstractClient.h
@class AbstractMediator;
//AbstractClient作為抽象基類,封裝客戶類(官方說法叫同事類)的通用屬性、方法
@interface AbstractClient : NSObject
@property (nonatomic,strong) AbstractMediator *mediator;
@property (nonatomic,copy)? NSString *name;
//委托中介辦事
- (void) entrustMediator:(AbstractMediator *)mediator;
@end
AbstractMediator.h
@class AbstractClient;
//AbstractMediator作為抽象基類,封裝中介者類的通用屬性、方法
@interface AbstractMediator : NSObject
@property (nonatomic,copy) NSString *name;//中介名字
@property (nonatomic,strong) NSMutableArray *clients;//保存客戶
//保留客戶資料
- (void) saveClintProfile:(AbstractClient *)client
MediatorLJ.h
@interface MediatorLJ : AbstractMediator
//為買家篩選房源,和合適的賣家配對起來
- (void) screenHouseForBuyer:(Buyer *)buyer;
@end
AbstractMediator類和MediatorLJ類便完成了定義中的第一點“封裝一系列的對象交互”!
Buyer.h
@interface Buyer : AbstractClient
@property (nonatomic,assign) NSInteger money;//買家成副身家
- (void) buyHouse;
@end
Seller.h
@interface Seller : AbstractClient
@property (nonatomic,assign) NSInteger price;//賣家房子的價值
@end
main.m
//從前,有家地產中介叫偉恒地產
MediatorLJ *weihengMdr = [[MediatorLJ alloc] init];
weihengMdr.name = @"偉恒地產";
//一天,小民有套500萬的別墅想賣了,委托偉恒地產幫忙賣
Seller *xiaoMin = [[Seller alloc] init];
xiaoMin.name = @"小民";
xiaoMin.price = 5000000;//看看有沒寫少個0,是的話買家就賺大發了
[xiaoMin entrustMediator:weihengMdr];
//偉恒地產留下小民信息
[weihengMdr saveClintProfile:xiaoMin];
//第二天,小焰有套100萬的樓梯房想賣了,委托偉恒地產幫忙賣
Seller *xiaoYan = [[Seller alloc] init];
xiaoYan.name = @"小焰";
xiaoYan.price = 1000000;
[xiaoYan entrustMediator:weihengMdr];
[weihengMdr saveClintProfile:xiaoYan];
//第三天小思想買房,到了偉恒地產找房源
Buyer *xiaoSi = [[Buyer alloc] init];
xiaoSi.money = 1500000;
xiaoSi.name = @"小思";
[xiaoSi entrustMediator:weihengMdr];
//偉恒地產留下小思的信息
[weihengMdr saveClintProfile:xiaoSi];
//偉恒地產給小思匹配房源
[xiaoSi buyHouse];
從示例代碼main.m中可以看出,seller和buyer之間沒有了直接的聯系,原本相互影響、相互依賴引用的關系消除了,只和中介有通信,所有的交互邏輯都集中在中介者類中,是不是想想都爽呢!!!
完整的demo放在GitHub上,歡迎觀看學習? ~中介者模式demo
四、模式分析
中介者模式是一個相對容易理解的模式,我們很容易就能結合現實生活中去。做iOS開發的必然使用過MVC模式,MVC模式是中介者模式的一種表現形式,Comtroller(中介者)承擔兩個同事類(View和Modle)之間的中轉和協調作用。
中介者模式的優點
①解耦合
模式中把多個同事類的交互邏輯封裝在中介類中,同事類之間不再相互依賴引用,各個同事類可以獨立變化
②把交互邏輯集中管理
當同事類間的交互發生變化時,只需要在中介者修改邏輯,提高了開發效率又降低了維護成本,可謂一舉兩得
中介者模式的缺點
中介者模式的優點如果使用不好可能就變成了缺點,由于交互邏輯的高度集中化,中介者會隨著業務邏輯的不斷增加而變得臃腫膨脹,變得難以管理。
五、總結
第一次寫技術博客,心情無比激動啊!!!希望本文能給讀到這兒的你有所幫助,文中有什么不足請勿手下留情,大聲地懟我,喜歡可以點個贊哦,非常感謝大家的支持!