在一个项目里,程序由大量的类来组成。随着功能的不断增长,类和类之间的依赖关系也跟着趋于复杂,而中介者模式便能解决这个问题。 中介者模式,是用一个对象来封装一组或一系列对象的交互方式,使对象间的交互能够在一个中介者对象中处理,从而使各对象耦合松散,并且能够独立的改变它们之间的交互。前端
中介者比如站在十字路口的交通警察。若是改变十字路口的交通模式,只须要把新的交通策略给交通警察便可,而不是路上的全部车辆,这样才能更好的协调来自不一样方向车辆。markdown
一、松散耦合oop
中介者模式经过把多个同事对象之间的交互封装到中介对象里面,从而使得同时对象之间松散耦合,基本上能够作到互不依赖。这样一来,同时对象就能够独立的变化和复用,再也不“牵一发动全身”。优化
二、集中控制交互atom
多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只须要修改中介者就能够了。spa
三、多对多变为一对多设计
没有中介者模式的时候,同事对象之间的关系一般是多对多,引入中介者对象后,中介者和同事对象的关系一般变为双向的一对多,这会让对象的关系更容易理解和实现。code
一、Mediator:抽象中介者 在里面定义各个同事之间交互须要的方法,能够是公共的通讯方法,也能够是小范围的交互方法。 二、ConcreteMeditor:具体中介者 它须要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。 三、Colleague:抽象同事类 主要约束同事对象的类型,并实现一些具体同事类之间的公共功能,好比,每一个具体同事类都应该知道中介者对象,也就是具体同事类都会持有中介者对象,均可以到这个类里面。 四、ConcreteColleague:具体同事类 实现本身的业务,须要与其余同事通讯时候,就与持有的中介者通讯,中介者会负责与其余同事类交互。orm
MVC中的C(controller)就是一个中介者,它的做用就是把M和V隔离开,协调M和V协同工做,把M运行的结果和V表明的视图融合成一个前端能够展现的页面,减小M和V的依赖关系。对象
iOS中的UINavigationController就是一个中介者,他来管理视图的跳转。通常状况下,一个页面便对应代码中的一个VC,而一个中等规模的软件至少会有几十个的页面,对应的就是几十个VC。要管理这些VC之间的关系是一件很是繁琐的事情,每当一个VC要跳转到另外个VC,咱们须要包含新的VC的头文件,因而有的起衔接做用的VC中包含了大量的其余VC的头文件。使用中介者模式能够很是好地去解决这个问题。
下面就以此为例,说明中介者模式的应用
需求描述:在一个根视图控制器中(暂且称之为rootVC),点击不一样的按钮,跳到对应的视图控制器,分别是firstVC、secondVC、thirdVC。
传统作法策略图 从图中看到,这样的处理方式繁乱复杂,不够清晰,当控制器VC数量很是多时,更加难以维护。
中介者模式策略图 从图中能够直观感觉到,处理方式简洁明了。Mediator类的做用就至关于一个路由器,将客户发起的URL请求转移到对应的类。
下面来设计这个类
中介者,在应用程序整个生命周期应该只有一个实例,不然将没法管理多个对象间的交互,因此这里要使用单例来实现它的建立。这个过程就略过了,直接看重点部分。 首先添加2个控制器属性,一个表示用于发起跳转动做的控制器;另外一个表示目的控制器。 在类的.h文件里,声明属性、方法。
@interface Mediator : NSObject
@property (nonatomic, strong, readonly) ViewController *rootVC;
@property (nonatomic, strong, readonly) UIViewController *activeVC;
// 单例建立类方法
+ (MediatorManager *)sharedManager;
// 外界跳转调用方法
- (void)jumpToNewViewController:(id)tagValue;
@end
复制代码
在.m文件里面 导入全部须要跳转的控制器头文件
#import "ViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"
复制代码
实现跳转方法,根据传入的参数,决定跳转到哪一个控制器VC
- (void)jumpToNewViewController:(id)tagValue{
if ([tagValue isKindOfClass:[NSNumber class]]) {
switch ([tagValue integerValue]) {
case 1:
{
FirstViewController *firstVC = [[FirstViewController alloc] init];
_activeVC = firstVC;
[self.rootVC.navigationController pushViewController:firstVC animated:YES];
}
break;
case 2:
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
_activeVC = secondVC;
[self.rootVC.navigationController pushViewController:secondVC animated:YES];
}
break;
case 3:
{
ThirdViewController *thirdVC = [[ThirdViewController alloc] init];
_activeVC = thirdVC;
[self.rootVC.navigationController pushViewController:thirdVC animated:YES];
}
break;
default: // 其余状况,默认返回
_activeVC = self.rootVC;
[self.rootVC.navigationController popViewControllerAnimated:YES];
break;
}
}
}
复制代码
这里,能够再优化一点,把各控制器VC对应标识符统一放在枚举变量里,方便管理。
typedef NS_ENUM(NSInteger, ButtonTag) {
TagFirstVC = 1,
TagSecondVC = 2,
TagThirdVC = 3,
};
复制代码
中介者模式的应用不光用在VC的管理,当功能中出现了相似“多对多”的复杂的对象群时,就能够用到它来管理这些对象。 固然,在此以前,须要考虑的不该该是开始使用中介者模式,而是考虑这个功能的设计是否合理。 另外,使用中介者模式虽然下降了各个对象之间的耦合,减小了对象之间逻辑的复杂度,可是这个复杂度在必定程度上转移到了Mediator类中,所以Mediator类的功能维护须要谨慎处理。