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的头文件。使用中介者模式可以非常好地去解决这个问题。

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


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