iOS开发-中介者模式

简介

在一个项目里,程序由大量的类来组成。随着功能的不断增长,类和类之间的依赖关系也跟着趋于复杂,而中介者模式便能解决这个问题。 中介者模式,是用一个对象来封装一组或一系列对象的交互方式,使对象间的交互能够在一个中介者对象中处理,从而使各对象耦合松散,并且能够独立的改变它们之间的交互。前端

中介者比如站在十字路口的交通警察。若是改变十字路口的交通模式,只须要把新的交通策略给交通警察便可,而不是路上的全部车辆,这样才能更好的协调来自不一样方向车辆。markdown

好处

一、松散耦合oop

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

二、集中控制交互atom

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

三、多对多变为一对多设计

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

模式结构

QQ.png 一、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。

传统作法策略图 QQ.png 从图中看到,这样的处理方式繁乱复杂,不够清晰,当控制器VC数量很是多时,更加难以维护。

中介者模式策略图 QQ.png 从图中能够直观感觉到,处理方式简洁明了。Mediator类的做用就至关于一个路由器,将客户发起的URL请求转移到对应的类。

下面来设计这个类

中介者Mediator类的设计

中介者,在应用程序整个生命周期应该只有一个实例,不然将没法管理多个对象间的交互,因此这里要使用单例来实现它的建立。这个过程就略过了,直接看重点部分。 首先添加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类的功能维护须要谨慎处理。

其余模式

www.jianshu.com/u/59025f8e5…

相关文章
相关标签/搜索