iOS 中介者模式, 源于生活的艺术 ── 黑中介

去年还能买市区,今朝只能看郊区
当下郊区不买房,明年得看地下室
出去旅游四五天,回来少个卫生间
曾经全款变首付,现在首付变车库


买房的时候由于卖家多, 买家也多
卖家和买家的沟通成本会很大
就像这个样子 :

没有房屋中介

基于广大人民群众的智慧
就诞生了黑中介这个伟大职业
所有卖家把房屋信息交给黑中介
所有买家都去黑中介这里去咨询房屋信息
这样沟通的效率就会大大提高
就像这样 :

加入房屋中介

中介者模式基本定义 :

面向对象的设计鼓励把行为分散到不同的对象中
这种分散可能导致对象之间的相互关联
更糟糕的情况就导致了对象之间彼此了解并相互操作
中介者模式定义于一个集中场所
对象间的交互可以在一个中介者对象中处理
其他对象不必彼此交互
因此减少了他们的依存关系
这是中介者模式的 UML 图 :

UML
  • Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口。
  • ConcreteMediator:具体中介者角色(也就是房屋黑中介),它从具体的同事对象接收消息,向具体同事发出命令。
  • Colleague:抽象同事角色,定义了中介者对象接口,它只知道中介者而不知道其他同事对象。
  • ConcreteColleague:具体同事角色(也就是房屋买卖方),每个具体同事类都知道自己在小范围内的行为。

实例代码 :

Demo地址
下面简单介绍一下实现过程 :
首先是抽象中介者类, 也就是房屋黑中介的抽象类
他有中介者所共有的一些特性
比如黑中介的名称
给卖房客户提供房屋信息登记功能
还有给买房用户提供房屋信息功能

@interface HXAbstractMediator : NSObject

/** 中介名字 */
@property (nonatomic,copy) NSString *name;

/** 所有客户 */
@property (nonatomic,strong) NSMutableArray<HXAbstractClient *> *clients;

/** 添加客户资料 */
- (void)addClintProfile:(HXAbstractClient *)client;

/** 我要买房 */
- (NSArray<HXAbstractClient *> *)screenHouseForBuyer:(HXAbstractClient *)buyer;

@end

然后是抽象同事类, 也就是房屋的买房和卖方的抽象类
他有一些公用属性
比如客户名字
卖家房屋价格
买家资金等等

@interface HXAbstractClient : NSObject

/** 客户名字 */
@property (nonatomic,copy) NSString *name;

/** 如果作为买家, 我又多少钱 */
@property (nonatomic,assign) NSInteger money;

/** 如果作为卖家, 我得房子值多少钱 */
@property (nonatomic,assign) NSInteger price;

@end

然后
继承中介抽象类 创建黑中介房屋中介公司 HXMediatorBlack
继承抽象同事类 创建卖方老张 HXClientZhang
继承抽象同事类 创建卖方老李 HXClientLi
继承抽象同事类 创建买房小王 HXClientWang
(具体实现在 Demo 中, 这里就不赘述)
然后进行如下买房流程 :

        HXMediatorBlack *mediatorBlack = [[HXMediatorBlack alloc] init];
        NSLog(@"我是 : %@", mediatorBlack.name);
        
        HXClientLi *clientLi = [[HXClientLi alloc] init];
        NSLog(@"我是 : %@, 我的房屋价格 : %ld", clientLi.name, clientLi.price);
        
        HXClientZhang *clientZhang = [[HXClientZhang alloc] init];
        NSLog(@"我是 : %@, 我的房屋价格 : %ld", clientZhang.name, clientZhang.price);
        
        HXClientWang *clientWang = [[HXClientWang alloc] init];
        NSLog(@"我是 : %@, 我有多少钱 : %ld", clientWang.name, clientWang.money);
        
        // 卖家联系黑中介要卖房, 黑中介记录卖家信息
        [mediatorBlack addClintProfile:clientLi];
        [mediatorBlack addClintProfile:clientZhang];
        
        // 小王找到黑中介要买房, 黑中介看看小王能买得起谁的房子
        NSArray<HXAbstractClient *> *array = [mediatorBlack screenHouseForBuyer:clientWang];
        NSLog(@"最终小王能买得起 %ld 套房子", array.count);

打印结果就是 :

2019-03-05 22:01:57.658407+0800[1066:36865] 我是 : 黑中介房屋中介公司, 不黑不要钱
2019-03-05 22:01:57.658587+0800[1066:36865] 我是 : 炒房老李, 我的房屋价格 : 5000000
2019-03-05 22:01:57.658947+0800[1066:36865] 我是 : 包租婆老张, 我的房屋价格 : 4800000
2019-03-05 22:01:57.659157+0800[1066:36865] 我是 : 苦逼的程序员小王, 我有多少钱 : 28
2019-03-05 22:01:57.659364+0800[1066:36865] 最终小王能买得起 0 套房子

这样小王芳芳不需要分别找老张和老李
老张老李卖房也不用都去找小王
大家都很省心嘛


总结 :

一 : 中介者模式的优势 :

1、松散耦合

中介者模式通过把多个同事对象之间的交互封装到中介对象里面,从而使得同时对象之间松散耦合,基本上可以做到互不依赖。这样一来,同时对象就可以独立的变化和复用,不再“牵一发动全身”。

2、集中控制交互

多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者就可以了。

3、多对多变为一对多

没有中介者模式的时候,同事对象之间的关系通常是多对多,引入中介者对象后,中介者和同事对象的关系通常变为双向的一对多,这会让对象的关系更容易理解和实现。

二 : 中介者模式的弊端 :

1、难以维护

中介者模式以中介者内部复杂性代替交互的复杂性, 中介者的封装合并了同事对象之间的协作逻辑, 自身变得可能比任何一个同事都要复杂, 难以维护.

三 : 典型应用场景 :

1、MVC

MVC中的C(controller)就是一个中介者,它的作用就是把M和V隔离开,协调M和V协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少M和V的依赖关系。

2、UINavigationController

iOS中的UINavigationController就是一个中介者,他来管理视图的跳转。一般情况下,一个页面便对应代码中的一个VC,而一个中等规模的软件至少会有几十个的页面,对应的就是几十个VC。要管理这些VC之间的关系是一件非常繁琐的事情,每当一个VC要跳转到另外个VC,我们需要包含新的VC的头文件,于是有的起衔接作用的VC中包含了大量的其他VC的头文件。使用中介者模式可以非常好地去解决这个问题。

感谢阅读
你的点赞是我写作的唯一动力


享元模式
工厂模式
建造者模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335