iOS设计模式--中介者模式

         近两年,中国房价可谓疯狂至极,买卖房产获利非常可观,房地产中介行业也因此生机蓬勃。大街上的“xx地产”随处可见,在街上发传单追你一条街推销房子的中介人屡见不鲜,当然也没少接到来自中介的骚扰电话咯。大家对中介这种角色估计也不陌生,所以今天的设计模式就以这个房地产中介作为故事背景吧!

《iOS设计模式--中介者模式》

无中介.jpg

从无中介.jpg可以看出,要是没有中介的存在,买卖家之间的交流是如此困难且复杂。买家买房要跑去找卖家,卖家买房又得跑去找买家。如果现实真的如此,估计买卖家早就拍桌子说:“老子xx不买(卖)了!”如此反复,房地产业还可能像现在这样撑起国家经济吗?

《iOS设计模式--中介者模式》

有中介.jpg

好了,有中介的接入,一切都变得so easy了!买家要买房,直接到中介看房源,卖家卖房,直接委托中介推销,买卖家通过中介相互取得联系,进行沟通,最后达成买卖共识。呃..不瞎扯了,马上进入的主题!!!!

一、基本定义

定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

在中介者模式的定义中,各个类都被看作两个大类,分别是中介者类和同事类。

这句官方的定义看起来很抽象吧,要不试试结合我们的故事背景思考思考~这段定义可以分为4段来理解(中介者类=中介人,同事类=买卖家):

①用一个中介者对象封装一系列的对象交互——这就好比中介人拥有买卖家双方的联系方式,在买卖过程中向买卖家提供最新的消息和有效的帮助等等

②中介者使各对象不需要显示地相互作用——买卖家双方都会把意愿交待给中介人,透过中介人把意愿传达给对方,而不需要买卖家之间直接通电话联系

③从而使耦合松散——买卖家之间的联系从“买家<——>买家”变成“买家<——>中介<——>买家”,买卖家的直接联系断开,中介成为买卖双方联系的桥梁

④可以独立地改变它们之间的交互——中介告诉卖家房价升了,卖家就做出升价的决定看到这里,有些童鞋应该已经从一脸懵逼进化到“原(san)来(lian)如(meng)此(bi)”。咳咳…..马上进入下一环节let go!!!

二、UML

马上进入第二环节,请认真看UML图 * 3 (重要事情说三遍!!!)

《iOS设计模式--中介者模式》

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)之间的中转和协调作用。

中介者模式的优点

①解耦合

模式中把多个同事类的交互逻辑封装在中介类中,同事类之间不再相互依赖引用,各个同事类可以独立变化

②把交互逻辑集中管理

当同事类间的交互发生变化时,只需要在中介者修改逻辑,提高了开发效率又降低了维护成本,可谓一举两得

中介者模式的缺点

中介者模式的优点如果使用不好可能就变成了缺点,由于交互逻辑的高度集中化,中介者会随着业务逻辑的不断增加而变得臃肿膨胀,变得难以管理。

五、总结

第一次写技术博客,心情无比激动啊!!!希望本文能给读到这儿的你有所帮助,文中有什么不足请勿手下留情,大声地怼我,喜欢可以点个赞哦,非常感谢大家的支持!

    原文作者:算法小白
    原文地址: https://juejin.im/entry/59ba49f1f265da0669084711
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞