cover_image

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

flyflyho Cocoa开发者社区
2017年09月15日 01:00

近两年,中国房价可谓疯狂至极,买卖房产获利非常可观,房地产中介行业也因此生机蓬勃。大街上的“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)之间的中转和协调作用。


中介者模式的优点


①解耦合


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


②把交互逻辑集中管理


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


中介者模式的缺点


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


五、总结


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


图片

iPhone X

CC严选


听说你们都想买 iPhone X?

我只是买了个 iPhone X 而已

最新一代iPhone发布 你的钱包还安好吗

iPhone X二代概念图曝光:画面令果粉迷醉

iPhone X全面屏很惊艳 你可能不会注意到这些细节


图片

全彩高精度打印,还原美妙细腻的纹理

根据NASA公开的卫星图片数据

采用每像素0.1毫米的高分辨率3D打印技术,

真实还原每颗星球独一无二、美妙细腻的纹理

点击阅读原文,立即拥有AR太阳系

继续滑动看下一个
Cocoa开发者社区
向上滑动看下一个