前言

介绍几种方法,不使用if else语句也能做条件判断。

一:使用枚举

首先定义一个公用接口 RoleOperation,表示不同角色所能做的操作

package com.gavin.enums;

public interface RoleOperation {

    //定义一个方法来表示某个角色,有哪些op(操作)权限
String op();
}

接下来我们将不同角色的情况全部交由枚举类来做,定义一个不同角色有不同权限的枚举类

package com.gavin.enums;

public enum RoleEnum implements RoleOperation{

    //定义一个超级管理员的操作权限(有AAA的操作权限)
ROLE_ROOT_ADMIN {
@Override
public String op() {
return "ROLE_ROOT_ADMIN:has AAA permission";
}
}, //定义一个订单管理员的操作权限(有BBB的操作权限)
ROLE_ORDER_ADMIN {
@Override
public String op() {
return "ROLE_ORDER_ADMIN:has BBB permission";
}
}, //定义一个普通用户的操作权限(有CCC的操作权限)
ROLE_NORMAL {
@Override
public String op() {
return "ROLE_NORMAL:has CCC permission";
}
};
}

一行代码,if/else也灰飞烟灭了

package com.gavin.enums;

public class JudgeRole {

    public static void main(String[] args) {
String roleName = "ROLE_ROOT_ADMIN";
String operation = RoleEnum.valueOf(roleName).op();
System.out.println("操作权限:" + operation);
}
}

以后扩充条件,只需要去枚举类中加代码即可

二:使用工厂模式

不同分支做不同的事情,很明显就提供了使用工厂模式的契机,我们只需要将不同情况单独定义好,然后去工厂类里面聚合即可。

首先,针对不同的角色,单独定义其业务类:

package com.gavin.factory;

import com.gavin.enums.RoleOperation;

public class RootAdminRole implements RoleOperation {

    //定义属性值
private String roleName; //有参构造方法
public RootAdminRole (String roleName) {
this.roleName = roleName;
} //实现RoleOperation接口,然后重写接口方法
@Override
public String op() {
return roleName + " has AAA permission";
}
}
package com.gavin.factory;

import com.gavin.enums.RoleOperation;

public class OrderAdminRole implements RoleOperation {

    //定义属性值
private String roleName; //有参构造方法
public OrderAdminRole(String roleName) {
this.roleName = roleName;
} //实现RoleOperation接口,然后重写接口方法
@Override
public String op() {
return roleName + " has BBB permission";
}
}
package com.gavin.factory;

import com.gavin.enums.RoleOperation;

public class NormalRole implements RoleOperation {

    //定义属性值
private String roleName; //有参构造方法
public NormalRole(String roleName) {
this.roleName = roleName;
} //实现RoleOperation接口,然后重写接口方法
@Override
public String op() {
return roleName + " has CCC permission";
}
}

接下来再写一个工厂类 RoleFactory对上面不同角色进行聚合:

package com.gavin.factory;

import com.gavin.enums.RoleOperation;

import java.util.HashMap;
import java.util.Map; public class RoleFactory { //定义一个Map集合,使用static修饰后会与类一起加载进堆中
//加载顺序早于没有用static修饰的常量、变量和方法
static Map<String, RoleOperation> map = new HashMap<>(); //定义一个静态方法进行初始化
static {
map.put("ROLE_ROOT_ADMIN", new RootAdminRole("ROLE_ROOT_ADMIN"));
map.put("ROLE_ORDER_ADMIN", new OrderAdminRole("ROLE_ORDER_ADMIN"));
map.put("ROLE_NORMAL", new NormalRole("ROLE_NORMAL"));
} //定义一个获取操作权限的静态方法,提供给其它方法调用
public static RoleOperation getOp(String roleName) {
return map.get(roleName);
}
}

接下来借助上面这个工厂,业务代码调用也只需一行代码:


package com.gavin.factory; public class JudgeRole02 { public static void main(String[] args) {
/**
* 使用工厂模式实现思路,先调用RoleFactory类中的getOp方法,找到对应的角色对象中的权限
* 再调用该对象中的op()方法获取角色的权限信息
*/
String roleName = "ROLE_ROOT_ADMIN";
String operation = RoleFactory.getOp(roleName).op();
System.out.println("操作权限:" + operation);
}
}

扩展条件也很容易,只需要增加新代码,而不需要动以前的业务代码,非常符合“开闭原则”。

三:使用策略模式

策略模式和工厂模式写起来其实区别也不大!

在上面工厂模式代码的基础上,按照策略模式的指导思想,我们也来创建一个所谓的策略上下文类,这里命名为 RoleContext:

package com.gavin.strategy;

import com.gavin.enums.RoleOperation;

public class RoleContext {

    //定义可更换的策略,传入不同的策略对象,业务即相应变化
private RoleOperation roleOperation; public RoleContext(RoleOperation roleOperation) {
this.roleOperation = roleOperation;
} //定义获取角色权限的方法
public String execute() {
return roleOperation.op();
}
}

很明显上面传入的参数 operation就是表示不同的“策略”。我们在业务代码里传入不同的角色,即可得到不同的操作结果:

package com.gavin.strategy;

import com.gavin.enums.RoleOperation;
import com.gavin.factory.NormalRole;
import com.gavin.factory.OrderAdminRole;
import com.gavin.factory.RootAdminRole; public class JudgeRole03 { public static void main(String[] args) {
JudgeRole03 judgeRole03 = new JudgeRole03();
String operation = judgeRole03.judge(new RootAdminRole("ROLE_ROOT_ADMIN"));
System.out.println("operation=" + operation);
String operation2 = judgeRole03.judge(new OrderAdminRole("ROLE_ORDER_ADMIN"));
System.out.println("operation2=" + operation2);
String operation3 = judgeRole03.judge(new NormalRole("ROLE_NORMAL"));
System.out.println("operation3=" + operation3);
} //定义一个方法来调用RoleContext对象中获取角色权限的execute()方法
public String judge(RoleOperation roleOperation) {
RoleContext roleContext = new RoleContext(roleOperation);
return roleContext.execute();
}
}

几种常用的if else语句的优化方法,写代码前还是得多思考一番,考虑是否有更具可扩展性的写法!

四:实战应用

用枚举扩展实战

public class PublicEvent extends ProcessPubicListener {

    /**
* 全局流程监听事件
* @param eventName
* @param taskInstance
* @param processExecutionContext
*/
@Override
public void call(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
PublicOperationEnum.valueOf(eventName).pOperation(eventName,taskInstance,processExecutionContext);
System.out.println("操作流程是:" + "------======------ ------======------");
} }

定义接口:

public interface ProcessOperation {

    //定义一个方法来表示某个流程,有哪些(操作)
void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext);
}

定义枚举:


public enum PublicOperationEnum implements ProcessOperation { PROCESS_BEFORE_RESTART{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processBeforeRestart(eventName,processExecutionContext);
}
}, TASK_DELEGATE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.taskDelegate(eventName,taskInstance,processExecutionContext);
}
}, TASK_READ{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.taskRead(eventName,taskInstance);
}
}, PROCESS_CREATE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processCreate(eventName,processExecutionContext);
}
}, TASK_CREATE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.taskCreate(eventName,taskInstance,processExecutionContext);
}
}, PROCESS_BEFORE_DELETE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processBeforeDelete(eventName,taskInstance,processExecutionContext);
}
}, TASK_DELETE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.taskDelete(eventName,taskInstance,processExecutionContext);
}
}, PROCESS_DELETE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processDelete(eventName,taskInstance,processExecutionContext);
}
}, PROCESS_REMIND{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processRemind(eventName,taskInstance,processExecutionContext);
}
}, PROCESS_UPDATE{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processUpdate(eventName,taskInstance);
}
}, PROCESS_RESTART{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processRestart(eventName,taskInstance,processExecutionContext);
}
}, PROCESS_EVENT_END{
@Override
public void pOperation(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
ProcessTask.processEventEnd(eventName,taskInstance,processExecutionContext);
}
}; }

定义流程任务:


public class ProcessTask { public static void processEventEnd(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到[" + eventName + "]" + taskInstance);
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--[" + eventName + "]" +",结束!");
} public static void processRestart(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:流程重置事件[" + eventName + "]" + taskInstance);
System.out.println("此时,任务实例是空的!");
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--流程重置,结束!");
} public static void processUpdate(String eventName, TaskInstance taskInstance) {
System.out.println("--我监听到:流程修改事件[" + eventName + "]" + taskInstance);
System.out.println("此时,任务实例,流程实例都是是空的!");
System.out.println("--流程修改,结束!");
} public static void processRemind(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:流程催办[" + eventName + "]" + taskInstance);
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--流程催办,结束!");
} public static void processDelete(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:流程实例删除后[" + eventName + "]" + taskInstance);
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--流程实例删除后,结束!");
} public static void taskDelete(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:任务删除[" + eventName + "]" + taskInstance);
if(taskInstance==null){//当任务实例为空的时候是真删除,像流程撤销、流程实例删除
List<HistoryTaskInstance> deleteTaskList = (List<HistoryTaskInstance> )processExecutionContext.getParameter("taskList");
System.out.println("输出TASK_DELETE删除的已办任务实例(此处获取的删除任务列表是流程撤消前和流程删除前获取的总和)");
for(TaskInstance htask:deleteTaskList){
System.out.println("删除taskInstID为::"+htask.getId());
}
System.out.println("此时是真删除,像流程撤销、流程实例删除,流程实例、任务实例都是空的!");
}else{//当任务实例是非空,那么就是假删除,像流程提交
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("此时是假删除,像流程提交,流程实例、任务实例都是空的!");
}
System.out.println("--任务删除,结束!");
} public static void processBeforeDelete(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:流程实例删除前[" + eventName + "]" + taskInstance);
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
List<TaskInstance> tasks = SDK.getTaskQueryAPI().processInstId(processInstID).list();
System.out.println("输出删除前要删除的任务实例:");
for(TaskInstance task:tasks){
System.out.println("删除taskInstID为::"+task.getId());
}
List<HistoryTaskInstance> Historytasks = SDK.getHistoryTaskQueryAPI().processInstId(processInstID).list();
System.out.println("输出删除前要删除的已办任务实例");
for(TaskInstance htask:Historytasks){
System.out.println("删除taskInstID为::"+htask.getId());
}
System.out.println("流程实例::"+processInstID+"::状态:"+processState);
System.out.println("--流程实例删除前,结束!");
} public static void taskCreate(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:任务实例创建[" + eventName + "]" + taskInstance);
System.out.println("任务节点信息为:"+taskInstance.getActivityDefId());
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--任务实例创建,结束!");
} public static void processCreate(String eventName, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到流程实例创建[" + eventName + "]" );
System.out.println("此时,任务实例是空的!");
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--流程实例创建,结束!");
} public static void taskRead(String eventName, TaskInstance taskInstance) {
System.out.println("--我监听到:任务阅读[" + eventName + "]" + taskInstance);
System.out.println("--任务阅读,结束!");
} public static void taskDelegate(String eventName, TaskInstance taskInstance, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:任务转办[" + eventName + "]" + taskInstance);
System.out.println("转办人:"+taskInstance.getOwner());
String processInstID = processExecutionContext.getProcessInstance().getId();
String processState = processExecutionContext.getProcessInstance().getControlState();
Map<String,Object> parameters = processExecutionContext.getParameters();
if(parameters.containsKey("OLD_TASKINST")){
//获取转办前的执行人
TaskInstance oldtaskinst = (TaskInstance) parameters.get("OLD_TASKINST");
System.out.println("接收人:"+oldtaskinst.getTarget());
}
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--任务转办,结束!");
} public static void processBeforeRestart(String eventName, ProcessExecutionContext processExecutionContext) {
System.out.println("--我监听到:流程撤销前[" + eventName + "]");
System.out.println("此时,任务实例是空的!");
String processInstID = processExecutionContext.getProcessInstance().getId();
System.out.println("流程实例ID为["+processInstID+"]");
processExecutionContext.getProcessInstance().getControlState();
String processState = processExecutionContext.getProcessInstance().getControlState();
List<TaskInstance> tasks = SDK.getTaskQueryAPI().processInstId(processInstID).list();
System.out.println("输出撤消前要删除的待办任务实例");
for(TaskInstance task:tasks){
System.out.println("删除taskInstID为::"+task.getId());
}
List<HistoryTaskInstance> Historytasks = SDK.getHistoryTaskQueryAPI().processInstId(processInstID).list();
System.out.println("输出撤消前要删除的已办任务实例");
for(TaskInstance htask:Historytasks){
System.out.println("删除taskInstID为::"+htask.getId());
}
String processTitle=processInstID+processExecutionContext.getProcessInstance().getTitle();
System.out.println("流程实例::"+processTitle+"["+processInstID+"]::状态:"+processState);
System.out.println("--流程撤销前,结束!");
} }

if else 代码优化实战的更多相关文章

  1. 代码优化实战,3行代码解决了一百个if else!

    事情是这样的,前段时间做代码review的时候,发现项目中有一个方法代码量超鸡儿多,而且大部分都是写的参数校验的代码,得,我们先抓着缕一缕需求先. 产品需求 找到产品要到了需求文档,需求是这样得: e ...

  2. 类加载机制+JVM调优实战+代码优化

    类加载机制 Java源代码经过编译器编译成字节码之后,最终都需要加载到虚拟机之后才能运行.虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直 ...

  3. 【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.1.编译期优化。这章编译和实战部分没理解通,以后再看。

    1.概述 1.1.编译器的分类 前端编译器:Sun的Javac. Eclipse JDT中的增量式编译器(ECJ)[1].  把*.java文件转变成*.class文件 JIT编译器:HotSpot ...

  4. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  5. Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .SparkSQL的发展历程 1.1 Hive and Shark SparkSQL的前身是 ...

  6. iOS性能优化:Instruments使用实战

    iOS性能优化:Instruments使用实战   最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instrument ...

  7. Android APK 瘦身 - JOOX Music项目实战

    导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...

  8. Vue2.5开发去哪儿网App 从零基础入门到实战项目

    第1章 课程介绍本章主要介绍课程的知识大纲,学习前提,讲授方式及预期收获. 1-1 课程简介 试看第2章 Vue 起步本章将快速讲解部分 Vue 基础语法,通过 TodoList 功能的编写,在熟悉基 ...

  9. web语义化,从松散到实战

    GitHub:http://liu12fei08fei.github.io/html/4semantic.html web语义化,从松散到实战 在这篇文章之前,我放弃了很多次,写关于语义化方面的文章: ...

  10. jQuery2.0应用开发:SSH框架整合jQuery2.0实战OA办公自己主动化(VSS、operamasks-UI框架)

    我的qq是2059055336,对这个课程有兴趣的能够加我qq联系. 一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景 jQuery 2.0 正式版公布.不在支持 IE 6/7/8  ...

随机推荐

  1. position的值, relative和absolute分别是相对于谁进行定位的?

    relative:  相对定位,相对于自己本身在正常文档流中的位置进行定位 相对它原来的位置,在走100px.原来在标准流中的位置继续占有. absolute: 生成绝对定位,相对于最近一级定位不为s ...

  2. 【原创软件】第7期:文件夹生成器V1.0-按照列表批量生成文件夹,简单小巧

    一.背景 因为工作需要,需要批量创建文件夹.为了省去人工创建时间,使用aardio制作了一个软件. 二.功能演示 三.下载地址  https://www.123pan.com/s/9Rn9-1xppH ...

  3. PHP中引用的详解(引用计数、写时拷贝)

    转载:https://blog.csdn.net/ljguo212/article/details/8972865 1. PHP中引用的特性 PHP中引用意味着用不同的名字访问同一个变量内容,引用不是 ...

  4. oeasy教您玩转vim - 89 - # 高亮细节Highlight

    ​ 高亮细节 highight 回忆 这个自动命令 autocmd 还是很方便的 打开时.保存时就会有自动执行的操作 自动命令有这么几大元素 {event} 触发事件 {pattern} 文件模式 { ...

  5. Volatile不保证原子性及解决方案

    原子性的意义 原子性特别是在并发编程领域,是一个极其重要的概念,原子性指的是一个操作或一组操作要么全部执行成功,要么全部不执行,不会出现部分执行的情况.这意味着原子性操作是不可分割的,它们在执行过程中 ...

  6. Oracle 删除大量表记录操作总结

    By:授客 QQ:1033553122 删除表数据操作 清空所有表记录 TRUNCATE TABLE your_table_name; 或者批量删除满足条件的表记录 BEGIN LOOP DELETE ...

  7. MFC 关于按键状态获取

    alt键会阻断消息? moousemovealt键无法判断,按下一次 并松开一次状态改变一次#define KeyState GetAsyncKeyState BOOL bCtrlDown = (Ke ...

  8. 搭建lnmp环境-php(第二步)

    系统环境:centos7 php7.4 编译安装太繁琐,这里用yum安装即可 ===========yum形式安装======== # 安装EPEL源(nginx那里已安装了,跳过) yum inst ...

  9. Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig

    title: Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig date: 2024/7/29 updated: 2024/7/29 author: cmdragon exc ...

  10. wireshark抓包分析数据

    wireshark抓包分析数据 https://www.cnblogs.com/moonbaby/p/10528401.html https://blog.csdn.net/wangyiyungw/a ...