iOS设计模式之中介者模式

作者: flyflyho | 来源:发表于2017-09-14 14:35 被阅读901次

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

    中介者模式的优点

    ①解耦合

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

    ②把交互逻辑集中管理

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

    中介者模式的缺点

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


    五、总结

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

    相关文章

      网友评论

      • lg8294:具体中介者和具体同事相互引用了吧,应该要考虑下内存释放的。
      • soulDxl:代码块可以用``` 代码```效果更好:smile:
      • 雨影:这不就是代理设计模式么?OC核心模式
        雨影:@flyflyho 哦哦
        flyflyho:@雨影 相似但不是代理模式哦...代理模式中代理和委托方不相互持有..而中介者和同事类相互持有。最重要的特点是代理模式的代理和委托都继承相同的接口...而中介者不是
      • HYY:limboy与casatwy组件化的叫法不如改为中介者或中间件,感谢分享
        也可以看下bang的分析: http://blog.cnbang.net/tech/3080/
      • b8f45e0df599:真滴6
      • bed835114576:好好好写得好!远近书疏,莫不手答,笔翰如流未尝壅滞。真佩服,满腹经纶!这果然是奥妙!
      • YoungManSter:👍👍
      • Real_young:牛逼
        flyflyho:@real_young 怎么啦
        Real_young:@flyflyho 你的github看着略蛋疼。。
        flyflyho:@real_young 共同进步:relieved:
      • Jet啟思:学习了!
        flyflyho:@Jet啟思 :grin:谢谢支持

      本文标题:iOS设计模式之中介者模式

      本文链接:https://www.haomeiwen.com/subject/juinjxtx.html