老生常談:狀態(tài)模式
背景
做為一名使用高級(jí)語言的程序員,面向?qū)ο蟮脑O(shè)計(jì)一直都是體現(xiàn)程序員能力的重要標(biāo)準(zhǔn)之一,所以在我工作兩年后也就是2008年我也開始了對(duì)于面向?qū)ο笤O(shè)計(jì)的學(xué)習(xí),主要是拿GOF設(shè)計(jì)模式來練手,盡管實(shí)際項(xiàng)目中沒有真正的使用過。常見的23種設(shè)計(jì)模式,我從2008一至到2009年將近一年的時(shí)間我基本上將這些模式都寫了一篇Demo,但可能是當(dāng)時(shí)的認(rèn)識(shí)問題有少部分的模式我并沒有寫下筆記,比如這篇重點(diǎn)分享的狀態(tài)模式。
案例
由于我工作的項(xiàng)目大多以后臺(tái)業(yè)務(wù)為主,所以簡(jiǎn)單的審核流程非常常見。一說到審核流程,我們可以說市面上有好多工作流的產(chǎn)品可以選擇,這當(dāng)然是好的,但有些項(xiàng)目剛開始規(guī)模比較小,需求也比較簡(jiǎn)單,從技術(shù)成本以及效率上來講一般都不會(huì)考慮在項(xiàng)目剛開始的時(shí)候就引用工作流引擎,基本上都是通過常規(guī)的數(shù)據(jù)狀態(tài)扭轉(zhuǎn)即可達(dá)到目的,說的直白點(diǎn)就是根據(jù)不同的數(shù)據(jù)狀態(tài)來做不同的操作。拿我最近的一個(gè)產(chǎn)品申請(qǐng)功能來講,它具備一個(gè)典型的狀態(tài)扭轉(zhuǎn)流程:
- 保存
- 提交
- 審核
- 拒絕
- 預(yù)發(fā)布
- 上架
- 下架
- 刪除
操作人員在實(shí)現(xiàn)產(chǎn)品申請(qǐng)的狀態(tài)變更時(shí),一般寫程序步驟是這樣的:
- 獲取申請(qǐng)的當(dāng)前狀態(tài)
- 判定當(dāng)前的申請(qǐng)狀態(tài)是否允許做審核操作,一般會(huì)出現(xiàn)類似如下的代碼:
private void checkStatusForEdit(ProductRequest request) throws ProductServiceException { if(request.getAuditStatus()==AuditStatus.Approved &&(request.getPublishStatus()==PublishStatus