if else 代碼優化實戰

前言
介紹幾種方法,不使用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("--流程撤銷前,結束!");
    }
    
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章