iOS 中介者模式, 源于生活的艺术 ── 黑中介
去年还能买市区,今朝只能看郊区
当下郊区不买房,明年得看地下室
出去旅游四五天,回来少个卫生间
曾经全款变首付,现在首付变车库
买房的时候由于卖家多, 买家也多
卖家和买家的沟通成本会很大
就像这个样子 :
基于广大人民群众的智慧
就诞生了黑中介这个伟大职业
所有卖家把房屋信息交给黑中介
所有买家都去黑中介这里去咨询房屋信息
这样沟通的效率就会大大提高
就像这样 :
中介者模式基本定义 :
面向对象的设计鼓励把行为分散到不同的对象中
这种分散可能导致对象之间的相互关联
更糟糕的情况就导致了对象之间彼此了解并相互操作
中介者模式定义于一个集中场所
对象间的交互可以在一个中介者对象中处理
其他对象不必彼此交互
因此减少了他们的依存关系
这是中介者模式的 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的头文件。使用中介者模式可以非常好地去解决这个问题。
感谢阅读
你的点赞是我写作的唯一动力