近两年,中国房价可谓疯狂至极,买卖房产获利非常可观,房地产中介行业也因此生机蓬勃。大街上的“xx地产”随处可见,在街上发传单追你一条街推销房子的中介人屡见不鲜,当然也没少接到来自中介的骚扰电话咯。大家对中介这种角色估计也不陌生,所以今天的设计模式就以这个房地产中介作为故事背景吧!
无中介.jpg
从无中介.jpg可以看出,要是没有中介的存在,买卖家之间的交流是如此困难且复杂。买家买房要跑去找卖家,卖家买房又得跑去找买家。如果现实真的如此,估计买卖家早就拍桌子说:“老子xx不买(卖)了!”如此反复,房地产业还可能像现在这样撑起国家经济吗?
有中介.jpg
好了,有中介的接入,一切都变得so easy了!买家要买房,直接到中介看房源,卖家卖房,直接委托中介推销,买卖家通过中介相互取得联系,进行沟通,最后达成买卖共识。呃..不瞎扯了,马上进入的主题!!!!
一、基本定义
定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
在中介者模式的定义中,各个类都被看作两个大类,分别是中介者类和同事类。
这句官方的定义看起来很抽象吧,要不试试结合我们的故事背景思考思考~这段定义可以分为4段来理解(中介者类=中介人,同事类=买卖家):
①用一个中介者对象封装一系列的对象交互——这就好比中介人拥有买卖家双方的联系方式,在买卖过程中向买卖家提供最新的消息和有效的帮助等等
②中介者使各对象不需要显示地相互作用——买卖家双方都会把意愿交待给中介人,透过中介人把意愿传达给对方,而不需要买卖家之间直接通电话联系
③从而使耦合松散——买卖家之间的联系从“买家<——>买家”变成“买家<——>中介<——>买家”,买卖家的直接联系断开,中介成为买卖双方联系的桥梁
④可以独立地改变它们之间的交互——中介告诉卖家房价升了,卖家就做出升价的决定看到这里,有些童鞋应该已经从一脸懵逼进化到“原(san)来(lian)如(meng)此(bi)”。咳咳…..马上进入下一环节let go!!!
二、UML
马上进入第二环节,请认真看UML图 * 3 (重要事情说三遍!!!)
UML图
三、实例代码
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)之间的中转和协调作用。
中介者模式的优点
①解耦合
模式中把多个同事类的交互逻辑封装在中介类中,同事类之间不再相互依赖引用,各个同事类可以独立变化
②把交互逻辑集中管理
当同事类间的交互发生变化时,只需要在中介者修改逻辑,提高了开发效率又降低了维护成本,可谓一举两得
中介者模式的缺点
中介者模式的优点如果使用不好可能就变成了缺点,由于交互逻辑的高度集中化,中介者会随着业务逻辑的不断增加而变得臃肿膨胀,变得难以管理。
五、总结
第一次写技术博客,心情无比激动啊!!!希望本文能给读到这儿的你有所帮助,文中有什么不足请勿手下留情,大声地怼我,喜欢可以点个赞哦,非常感谢大家的支持!