OA系統中一般都會存在一個流程審批的需求,然而部門的千姿百態,引起需求的變幻無窮;所以須要在設計及開發過程當中,更多地、更好的設計程序,以即可方便擴展其功能。java
在作項目的過程當中,客戶提出這樣一個需求:OA系統中對於業務流程的審批可分爲:流程性審批、非流程性審批還有其餘審批,流程性審批又包括流程A審批,流程B審批......非流程性和其餘審批也相似【以下圖所示】,最終返回的結果當前業務流程所在節點的狀態信息。編程
因爲我對設計模式並不熟悉,瞭解的東西頂多也就只會紙上談兵,吹吹水罷了。終於到了實戰了,拿到需求後,前先後後在E-R圖、功能設計上花了將近半個鍾,因而採用工廠模式來完成對這個需求的實現。設計模式
定義:簡單工廠模式是類的建立模式,又叫作靜態工廠方法(Static Factory Method)模式。簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例。app
類圖:(暫缺)ide
1. 業務審批接口類學習
1 package com.swyma.approval.core; 2 3 /** 4 * 查詢狀態接口 5 * @author yemaoan 6 * 7 */ 8 public interface IApprovalService { 9 10 public String getCurrnetStauts(String type); 11 }
2. 流程性審批類spa
package com.swyma.approval.service; import com.swyma.approval.core.IApprovalService; import com.swyma.approval.core.VirutalValue; /** * 流程性審批 * @author yemaoan * */ public abstract class FlowApprovalService implements IApprovalService{ public Long getInstantId(String type) { VirutalValue value = new VirutalValue(); //模擬數據 return value.getValue(type); } }
2.1 流程性A型審批類設計
package com.swyma.approval.service; /** * 流程性審批-->審批A * @author yemaoan * */ public class DelegateApprovalService extends FlowApprovalService { public String getCurrnetStauts(String type) { Long ident = super.getInstantId(type); // System.out.println(ident); //經過ident查找該流程所在節點的狀態 //... return "主管審覈"; } }
2.2 流程性B型審批類code
package com.swyma.approval.service; /** * 流程性審批-->審批B * @author yemaoan * */ public class PlanApprovalService extends FlowApprovalService { public String getCurrnetStauts(String type) { Long ident = super.getInstantId(type); //經過ident去查找該流程狀態 //... return "經理審覈"; } }
3. 非流程性審批類對象
package com.swyma.approval.service; import com.swyma.approval.core.IApprovalService; /** * 非流程性審批 * @author yemaoan * */ public class NotFlowApprovalService implements IApprovalService{ public String getCurrnetStauts(String type) { return "審覈中..."; } }
4. 其它審批類
package com.swyma.approval.service; import com.swyma.approval.core.IApprovalService; /** * 其餘方式審批 * @author yemaoan * */ public class OtherApprovalService implements IApprovalService { public String getCurrnetStauts(String type) { return "審覈經過"; } }
5. 其餘輔助類【模擬數據等】
5.1 模擬數據
package com.swyma.approval.core; import java.util.HashMap; import java.util.Map; /** * 模擬數據 * @author yemaoan * */ public class VirutalValue { private Map<String, Long> valueMap = new HashMap<String, Long>(); public VirutalValue() { valueMap.put("a", 1l); valueMap.put("b", 2l); valueMap.put("c", 3l); valueMap.put("d", 4l); } public Long getValue(String key) { return valueMap.get(key); } public void setValue(String key, Long value) { valueMap.put(key, value); } }
5.2 實例類信息
package com.swyma.approval.core; import java.util.HashMap; import java.util.Map; import com.swyma.approval.service.DelegateApprovalService; import com.swyma.approval.service.NotFlowApprovalService; import com.swyma.approval.service.OtherApprovalService; import com.swyma.approval.service.PlanApprovalService; /** * 實例化信息 * @author yemaoan * */ public class ApprovalMap { private Map<String, Class> approvalMap = new HashMap<String, Class>(); public ApprovalMap() { approvalMap.put("a1", DelegateApprovalService.class); approvalMap.put("a2", PlanApprovalService.class); approvalMap.put("b", NotFlowApprovalService.class); approvalMap.put("c", OtherApprovalService.class); } public Class getApproval(String key) { return approvalMap.get(key); } }
1. 從設計上看,基本上仍是符合了客戶的需求,能夠比較好的解決擴展方面的問題。增長新一個審批流程時,只須要在加多一個實例化,並在Approval加多一個映射值;
2. 這次也是第一次在實際項目中運用到設計模式,有收穫的同時也多少有一些盲點,我也將在之後的學習編程中,不斷地尋求解決方案。
1. 有沒有更好的方法或者模式能夠替代Approval這個類?這個類我在設計的過程當中是想避開if...else...的。