代碼調(diào)優(yōu)——利用策略模式優(yōu)化過多 if else 代碼

首先上實(shí)例代碼

if(a){
  //dosomething
}else if (b){
  //doshomething
}else if(c){   
  //doshomething
} else{   
  ////doshomething
}

這種大量的if else嵌套,邏輯會(huì)比較混亂帅刀,并且很容易出錯(cuò)让腹,比如這樣的

        if(SystemErrorCode.QUIT.getCode().equals(msg)){
            System.out.println(SystemErrorCode.QUIT.getCode());
        }else if(SystemErrorCode.ALL.getCode().equals(msg)){
            System.out.println(SystemErrorCode.ALL.getCode());
        }else if(SystemErrorCode.USER.getCode().equals(msg)){
            System.out.println(SystemErrorCode.USER.getCode());
        }else if(SystemErrorCode.ADMIN.getCode().equals(msg)){
            System.out.println(SystemErrorCode.ADMIN.getCode());
        }else if(SystemErrorCode.AI.getCode().equals(msg)){
            System.out.println(SystemErrorCode.AI.getCode());
        }else if(SystemErrorCode.QAI.getCode().equals(msg)){
            System.out.println(SystemErrorCode.QAI.getCode());
        }else if(SystemErrorCode.INFO.getCode().equals(msg)){
            System.out.println(SystemErrorCode.INFO.getCode());
        }else {
            System.out.println("nothing");
        }

剛開始條件比較少远剩,現(xiàn)在功能多了,每次新增一個(gè)else條件都需要仔細(xì)的核對骇窍,防止對之前的邏輯有影響
這是修改過后的代碼

        InnerCommand instance = innerCommandContext.getInstance(msg);
        instance.process(msg);

整體思路如下:

  • 定義一個(gè) InnerCommand 接口瓜晤,其中有一個(gè) process 函數(shù)交給具體的業(yè)務(wù)實(shí)現(xiàn)。
  • 根據(jù)自己的業(yè)務(wù)腹纳,會(huì)有多個(gè)類實(shí)現(xiàn) InnerCommand 接口痢掠;這些實(shí)現(xiàn)類都會(huì)注冊到 SpringBean 容器中供之后使用。
  • 通過客戶端輸入命令嘲恍,從 SpringBean 容器中獲取一個(gè) InnerCommand 實(shí)例足画。
  • 執(zhí)行最終的 process 函數(shù)。


    流程圖

    主要想實(shí)現(xiàn)的目的就是在有多個(gè)判斷條件佃牛,只需要根據(jù)當(dāng)前msg的狀態(tài)動(dòng)態(tài)的獲取 InnerCommand 實(shí)例淹辞。
    從源碼上來看最主要的就是 InnerCommandContext 類,他會(huì)根據(jù)當(dāng)前命令動(dòng)態(tài)獲取 InnerCommand 實(shí)例俘侠。

/**
 * @ProjectName: aServerAdmin
 * @Package: com.app
 * @ClassName: InnerCommandContext
 * @Description:求你了象缀,寫點(diǎn)注釋吧
 * @Author: Kevin
 * @CreateDate: 18/2/15 下午3:32
 * @UpdateUser:
 * @UpdateDate: 18/2/15 下午3:32
 * @UpdateRemark:
 * @Version: 1.0
 */
public class InnerCommandContext {

    @Autowired
    ApplicationContext applicationContext;

    public InnerCommand getInstance(String command) {
        //getAllClazz
        Map<String, String> allClazz = SystemErrorCode.getAllClazz();
        String[] trim = command.trim().split(" ");
        String clazz = allClazz.get(trim[0]);
        InnerCommand innerCommand = null;
        try {
            if (StringUtils.isEmpty(clazz)) {
                clazz = null;
            }
            innerCommand = (InnerCommand) applicationContext.getBean(Class.forName(clazz));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return innerCommand;
    }
}
  • 第一步是獲取所有的 InnerCommand 實(shí)例列表。
  • 根據(jù)客戶端輸入的命令從第一步的實(shí)例列表中獲取類類型兼贡。
  • 根據(jù)類類型從 Spring 容器中獲取具體實(shí)例對象攻冷。
/**
 * @ClassName: SystemErrorCode
 * @Description: 枚舉
 * @Author: Kevin
 * @CreateDate: 18/2/15 下午5:31
 * @UpdateUser:
 * @UpdateDate: 18/2/15 下午5:31
 * @UpdateRemark: 更新項(xiàng)目
 * @Version: 1.0
 */
public enum SystemErrorCode {

    QUIT(":quit", "", "PrintQuitCommand"),
    ALL(":all", "", "PrintAllCommand"),
    USER(":user", "", "PrintUserCommand"),
    ADMIN(":admin", "", "PrintAdminCommand"),
    AI(":ai", "", "PrintAiCommand"),
    QAI(":qai", "", "PrintQaiCommand"),
    INFO(":info", "", "PrintInfoCommand");
    private String code;
    private String desc;
    private String clazz;
    private static final Map<String, String> err_desc = new HashMap<String, String>();

    static {
        for (SystemErrorCode refer : SystemErrorCode.values()) {
            err_desc.put(refer.getCode(), refer.getClazz());
        }
    }

    private SystemErrorCode(String code, String desc, String clazz) {
        this.code = code;
        this.desc = desc;
        this.clazz = clazz;
    }

    public static Map<String, String> getAllClazz() {
        return err_desc;
    }
    public static String getDescByCode(int code) {
        return err_desc.get(code);
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public String getClazz() {
        return clazz;
    }
    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
}
/**
 * @ProjectName: aServerAdmin
 * @Package: com.app.command
 * @ClassName: InnerCommand
 * @Description: 接口代碼
 * @Author: Kevin
 * @CreateDate: 18/2/15 下午3:24
 * @UpdateUser:
 * @UpdateDate: 18/2/15 下午3:24
 * @UpdateRemark:
 * @Version: 1.0
 */
public interface InnerCommand {
    void process(String msg);
}

/**
 * @ProjectName: aServerAdmin
 * @Package: com.app.service
 * @ClassName: PrintAdminCommand
 * @Description:示例
 * @Author: Kevin
 * @CreateDate: 18/2/15 下午5:06
 * @UpdateUser:
 * @UpdateDate: 18/2/15 下午5:06
 * @UpdateRemark:
 * @Version: 1.0
 */
@Service
public class PrintAdminCommand implements InnerCommand {
    @Override
    public void process(String msg) {

    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遍希,隨后出現(xiàn)的幾起案子等曼,更是在濱河造成了極大的恐慌,老刑警劉巖凿蒜,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禁谦,死亡現(xiàn)場離奇詭異,居然都是意外死亡废封,警方通過查閱死者的電腦和手機(jī)州泊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漂洋,“玉大人遥皂,你說我怎么就攤上這事」羝” “怎么了演训?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贝咙。 經(jīng)常有香客問我样悟,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任窟她,我火速辦了婚禮陈症,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘震糖。我一直安慰自己录肯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布吊说。 她就那樣靜靜地躺著嘁信,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疏叨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天穿剖,我揣著相機(jī)與錄音蚤蔓,去河邊找鬼。 笑死糊余,一個(gè)胖子當(dāng)著我的面吹牛秀又,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贬芥,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吐辙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蘸劈?” 一聲冷哼從身側(cè)響起昏苏,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎威沫,沒想到半個(gè)月后贤惯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棒掠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年孵构,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烟很。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颈墅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雾袱,到底是詐尸還是另有隱情恤筛,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布谜酒,位于F島的核電站叹俏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏僻族。R本人自食惡果不足惜粘驰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一屡谐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝌数,春花似錦愕掏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唆貌,卻和暖如春滑潘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锨咙。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工语卤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酪刀。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓粹舵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骂倘。 傳聞我的和親對象是個(gè)殘疾皇子眼滤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 本次來一點(diǎn)實(shí)際開發(fā)中會(huì)用到的小技巧。 比如平時(shí)大家是否都會(huì)寫類似這樣的代碼: if(a){//dosomet...
    程序員日常填坑閱讀 645評論 0 1
  • 一历涝、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,720評論 0 10
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程诅需,因...
    小菜c閱讀 6,358評論 0 17
  • 今天去了稅務(wù)局,第一次找專管員睬关。也沒那么可怕诱担,多去去就好了,實(shí)在不行還有公司呢电爹。自己只要多去嘗試蔫仙,多問,弄清楚就可...
    旎旎曉閱讀 326評論 0 0
  • 隨時(shí)準(zhǔn)備說謝謝丐箩,就是要時(shí)刻有一顆感恩的心摇邦,活著就要感謝,這句話和公司“大家發(fā)”理念非常之相近屎勘。公司發(fā)展壯大...
    余建平閱讀 404評論 0 0