iOS功能模块工厂化

作者: 丁勒个东 | 来源:发表于2016-09-13 20:28 被阅读207次

在所有的面向对象语言中,许多类型的对象创建需要一些列步骤,你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象.在这些情况,新建对象的过程就是一个工厂.

Person.h Person.m

这也是一个简单工厂,我们只需要创建一个Person对象,而不用管它的创建过程.
可以说在一个app开发过程中,我们一直在用各式各样的工厂,只不过这些工厂所生产的都是一些小零件,还需要进一步加工才能成为才能变成可用的商品.
那么今天来讲讲功能模块的工厂化.由于移动设备的限制以及扁平化的普及,单个功能模块的功能会变得相对单一,如果依然多变,我们也可以把一个多变的模块切割成数个功能单一的模块.例如,医院里预约挂号就可以分为选择医生和选择医生号源两个流程.既然提到了预约挂号,那就以预约挂号为例子.
将种树流程细分下来如下:

预约挂号流程

其中


选择医生流程

为选择医生流程

选择号源流程

为选择号源流程.
正常流程下,我们会依次建立5个viewController,然后依次push,到最后输出号源.功能模块工厂化后则变为:
选择医生流程功能--输入:开始--->输出:医生;
选择号源流程功能--输入:医生--->输出:号源.
既然有了工厂流水线,那么就需要有一个管理员(manger)来接受输入得到结果后输出结果.管理员也要得到每个界面的管理权限,就是将viewController的代理设置为manager.根据管理风格也可以分为三种:

  • 链式传递.将第一个viewController代理设为manager,然后一次将后一个viewController的代理设置为前一个viewController,由viewController内部做push操作.在得到结果后,在通过一层层的代理将值返回给manager.
  • 折叠传递.将流程内的所有viewController的代理设置为manager,由manager处理push操作.得到结果后将值传给manager
  • 混合传递.也就是将链式传递和折叠传递混合使用.

manager还需要需要几个基本要点:1,能够记录起点位置;2在流程期间manager不能被销毁.

Paste_Image.png

使用时先创建manager的子类

DoctorManager.h DoctorManager.m

这样的话,整个选医院流程就可以通过manager子类来调用自己的方法

if (!_doctorManager)
{
    _doctorManager = [[DoctorManager alloc]init];
}
[_doctorManager selectDoctorWithStartViewController:self
                                  doctorSelectBlock:^(Doctor *doctor) {
    //拿到医生之后的操作
}];

同样的选号流程也可以做出一样的处理,那么整个预约流程就完全可以用以下代码来代替

if (!_doctorManager)
{
    _doctorManager = [[DoctorManager alloc]init];
}
[_doctorManager selectDoctorWithStartViewController:self
                                  doctorSelectBlock:^(Doctor *doctor)
{
    //拿到医生之后的操作 ->进入选号流程->申请单
    if (!_enterAppoint)
    {
        _enterAppoint = [[EmterApointManager alloc]init];
    }
    [_enterAppoint enterApoint];
    
}];

}
那么以后app项目中,不管是在哪个地方需要调用预约,只需要这段代码就搞定.
(未完待续...)

相关文章

网友评论

本文标题:iOS功能模块工厂化

本文链接:https://www.haomeiwen.com/subject/nabmettx.html