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...的。