在所有的面向对象语言中,许多类型的对象创建需要一些列步骤,你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象.在这些情况,新建对象的过程就是一个工厂.
这也是一个简单工厂,我们只需要创建一个Person对象,而不用管它的创建过程.
可以说在一个app开发过程中,我们一直在用各式各样的工厂,只不过这些工厂所生产的都是一些小零件,还需要进一步加工才能成为才能变成可用的商品.
那么今天来讲讲功能模块的工厂化.由于移动设备的限制以及扁平化的普及,单个功能模块的功能会变得相对单一,如果依然多变,我们也可以把一个多变的模块切割成数个功能单一的模块.例如,医院里预约挂号就可以分为选择医生和选择医生号源两个流程.既然提到了预约挂号,那就以预约挂号为例子.
将种树流程细分下来如下:
其中
为选择医生流程
为选择号源流程.
正常流程下,我们会依次建立5个viewController,然后依次push,到最后输出号源.功能模块工厂化后则变为:
选择医生流程功能--输入:开始--->输出:医生;
选择号源流程功能--输入:医生--->输出:号源.
既然有了工厂流水线,那么就需要有一个管理员(manger)来接受输入得到结果后输出结果.管理员也要得到每个界面的管理权限,就是将viewController的代理设置为manager.根据管理风格也可以分为三种:
- 链式传递.将第一个viewController代理设为manager,然后一次将后一个viewController的代理设置为前一个viewController,由viewController内部做push操作.在得到结果后,在通过一层层的代理将值返回给manager.
- 折叠传递.将流程内的所有viewController的代理设置为manager,由manager处理push操作.得到结果后将值传给manager
- 混合传递.也就是将链式传递和折叠传递混合使用.
manager还需要需要几个基本要点:1,能够记录起点位置;2在流程期间manager不能被销毁.
使用时先创建manager的子类
这样的话,整个选医院流程就可以通过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项目中,不管是在哪个地方需要调用预约,只需要这段代码就搞定.
(未完待续...)