近两年,中国房价可谓疯狂至极,买卖房产获利非常可观,房地产中介行业也因此生机蓬勃。大街上的“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)之间的中转和协调作用。
中介者模式的优点
①解耦合
模式中把多个同事类的交互逻辑封装在中介类中,同事类之间不再相互依赖引用,各个同事类可以独立变化
②把交互逻辑集中管理
当同事类间的交互发生变化时,只需要在中介者修改逻辑,提高了开发效率又降低了维护成本,可谓一举两得
中介者模式的缺点
中介者模式的优点如果使用不好可能就变成了缺点,由于交互逻辑的高度集中化,中介者会随着业务逻辑的不断增加而变得臃肿膨胀,变得难以管理。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。