在所有的面向?qū)ο笳Z(yǔ)言中,許多類型的對(duì)象創(chuàng)建需要一些列步驟,你可能需要計(jì)算或取得對(duì)象的初始設(shè)置; 選擇生成哪個(gè)子對(duì)象實(shí)例; 或在生成你需要的對(duì)象之前必須先生成一些輔助功能的對(duì)象.在這些情況,新建對(duì)象的過(guò)程就是一個(gè)工廠.
這也是一個(gè)簡(jiǎn)單工廠,我們只需要?jiǎng)?chuàng)建一個(gè)Person對(duì)象,而不用管它的創(chuàng)建過(guò)程.
可以說(shuō)在一個(gè)app開(kāi)發(fā)過(guò)程中,我們一直在用各式各樣的工廠,只不過(guò)這些工廠所生產(chǎn)的都是一些小零件,還需要進(jìn)一步加工才能成為才能變成可用的商品.
那么今天來(lái)講講功能模塊的工廠化.由于移動(dòng)設(shè)備的限制以及扁平化的普及,單個(gè)功能模塊的功能會(huì)變得相對(duì)單一,如果依然多變,我們也可以把一個(gè)多變的模塊切割成數(shù)個(gè)功能單一的模塊.例如,醫(yī)院里預(yù)約掛號(hào)就可以分為選擇醫(yī)生和選擇醫(yī)生號(hào)源兩個(gè)流程.既然提到了預(yù)約掛號(hào),那就以預(yù)約掛號(hào)為例子.
將種樹(shù)流程細(xì)分下來(lái)如下:
其中
為選擇醫(yī)生流程
為選擇號(hào)源流程.
正常流程下,我們會(huì)依次建立5個(gè)viewController,然后依次push,到最后輸出號(hào)源.功能模塊工廠化后則變?yōu)?
選擇醫(yī)生流程功能--輸入:開(kāi)始--->輸出:醫(yī)生;
選擇號(hào)源流程功能--輸入:醫(yī)生--->輸出:號(hào)源.
既然有了工廠流水線,那么就需要有一個(gè)管理員(manger)來(lái)接受輸入得到結(jié)果后輸出結(jié)果.管理員也要得到每個(gè)界面的管理權(quán)限,就是將viewController的代理設(shè)置為manager.根據(jù)管理風(fēng)格也可以分為三種:
- 鏈?zhǔn)絺鬟f.將第一個(gè)viewController代理設(shè)為manager,然后一次將后一個(gè)viewController的代理設(shè)置為前一個(gè)viewController,由viewController內(nèi)部做push操作.在得到結(jié)果后,在通過(guò)一層層的代理將值返回給manager.
- 折疊傳遞.將流程內(nèi)的所有viewController的代理設(shè)置為manager,由manager處理push操作.得到結(jié)果后將值傳給manager
- 混合傳遞.也就是將鏈?zhǔn)絺鬟f和折疊傳遞混合使用.
manager還需要需要幾個(gè)基本要點(diǎn):1,能夠記錄起點(diǎn)位置;2在流程期間manager不能被銷毀.
使用時(shí)先創(chuàng)建manager的子類
這樣的話,整個(gè)選醫(yī)院流程就可以通過(guò)manager子類來(lái)調(diào)用自己的方法
if (!_doctorManager)
{
_doctorManager = [[DoctorManager alloc]init];
}
[_doctorManager selectDoctorWithStartViewController:self
doctorSelectBlock:^(Doctor *doctor) {
//拿到醫(yī)生之后的操作
}];
同樣的選號(hào)流程也可以做出一樣的處理,那么整個(gè)預(yù)約流程就完全可以用以下代碼來(lái)代替
if (!_doctorManager)
{
_doctorManager = [[DoctorManager alloc]init];
}
[_doctorManager selectDoctorWithStartViewController:self
doctorSelectBlock:^(Doctor *doctor)
{
//拿到醫(yī)生之后的操作 ->進(jìn)入選號(hào)流程->申請(qǐng)單
if (!_enterAppoint)
{
_enterAppoint = [[EmterApointManager alloc]init];
}
[_enterAppoint enterApoint];
}];
}
那么以后app項(xiàng)目中,不管是在哪個(gè)地方需要調(diào)用預(yù)約,只需要這段代碼就搞定.
(未完待續(xù)...)