Java利用策略模式實現(xiàn)條件判斷,告別if else
定義
策略模式定義了一系列算法,并且將每個算法封裝起來,使得他們可以相互替換,而且算法的變化不會影響使用算法的客戶端。
使用場景
- 一個系統(tǒng)需要動態(tài)的在幾種算法中選擇一種,可以把每個算法封裝到具體的策略類中
- 一個類中定義了多種行為,可以去代替條件轉(zhuǎn)移語句,減少硬編碼
- 系統(tǒng)中各個算法或者說函數(shù)是彼此獨立的,而且要求對客戶隱藏算法具體實現(xiàn)細節(jié)的時候
- 多個類只區(qū)別在表現(xiàn)行為的不同,可以使用策略模式,在運行時動態(tài)的選擇要執(zhí)行的行為
案例
需求
根據(jù)不同的水果口味,制作不同的蛋糕,比如現(xiàn)在有蘋果味和香蕉味的蛋糕,入?yún)樘O果味,則制作蘋果味蛋糕;入?yún)橄憬段?,則制作香蕉味的蛋糕
實現(xiàn)方案
定義制作蛋糕的抽象類
/** * 蛋糕制作抽象類 * @author:liyajie * @createTime:2022/2/24 10:53 * @version:1.0 */ public abstract class CakeHandler { /** * 制作蛋糕 * @author: liyajie * @date: 2022/2/24 10:54 * @param * @return void * @exception: * @update: * @updatePerson: **/ public abstract void makeCake(); }
定義制作蘋果味蛋糕的策略類,繼承制作蛋糕抽象類,重寫makeCake方法
/** * 制作蘋果蛋糕策略 * @author:liyajie * @createTime:2022/2/24 10:55 * @version:1.0 */ public class AppleCakeHandler extends CakeHandler{ @Override public void makeCake() { System.out.println("正在制作蘋果蛋糕"); } }
定義制作香蕉味蛋糕的策略類,繼承制作蛋糕抽象類,重寫makeCake方法
/** * 制作香蕉蛋糕策略 * @author:liyajie * @createTime:2022/2/24 10:55 * @version:1.0 */ public class BananaCakeHandler extends CakeHandler{ @Override public void makeCake() { System.out.println("正在制作香蕉蛋糕"); } }
定義枚舉類,來制作蛋糕的策略
/** * 制作蛋糕枚舉 * @author:liyajie * @createTime:2022/2/24 10:57 * @version:1.0 */ public enum CakeEnum { APPLE(AppleCakeHandler.class.getSimpleName(),new AppleCakeHandler()), BANANA(BananaCakeHandler.class.getSimpleName(),new BananaCakeHandler()); private final String cakeType; private final CakeHandler cakeHandler; CakeEnum(String cakeType, CakeHandler cakeHandler){ this.cakeType = cakeType; this.cakeHandler = cakeHandler; } // 匹配策略類 public static CakeEnum match(String cakeType){ CakeEnum[] values = CakeEnum.values(); for (CakeEnum cakeEnum : values) { if(cakeType.equals(cakeEnum.cakeType)){ return cakeEnum; } } return null; } public String getCakeType(){ return cakeType; } public CakeHandler getCakeHandler(){ return cakeHandler; } }
定義測試類
/** * 測試類 * @author:liyajie * @createTime:2022/2/24 11:07 * @version:1.0 */ public class Test { public static void main(String[] args) { String cakeType = AppleCakeHandler.class.getSimpleName(); CakeEnum cakeEnum = CakeEnum.match(cakeType); CakeHandler cakeHandler = cakeEnum.getCakeHandler(); cakeHandler.makeCake(); cakeType = BananaCakeHandler.class.getSimpleName(); cakeEnum = CakeEnum.match(cakeType); cakeHandler = cakeEnum.getCakeHandler(); cakeHandler.makeCake(); } }
查看測試結(jié)果
方案分析
通過該案例的實現(xiàn),我們可以看到,使用策略模式+枚舉,替換掉了if--else的硬編碼,并且把不同的策略封裝到了單獨的實現(xiàn)類中,防止一個策略出現(xiàn)問題后影響到其他的策略,提高了系統(tǒng)的可擴展性,最大程度上實現(xiàn)了開閉原則。
總結(jié)
優(yōu)勢
- 多重條件語句屬于硬編碼不易維護,而使用策略模式可以避免使用多重條件語句
- 策略模式提供了一系列算法,恰當?shù)氖褂美^承或者實現(xiàn),可以把算法族里面的公共代碼提到父類里面。這樣就會避免重復的代碼
- 策略模式可以提供相同行為的不同實現(xiàn),客戶端可以根據(jù)具體的業(yè)務邏輯去選擇合適的
- 策略模式完美契合開閉原則,可以在不修改或者少修改源代碼的情況下,靈活增加、減少、修改新 算法
- 策略模式把算法的使用放到環(huán)境類中,而算法的實現(xiàn)在具體策略類中,實現(xiàn)了二者的分離
劣勢
- 在實際業(yè)務邏輯非常復雜的情況下,會導致出現(xiàn)很多策略類
- 客戶端必須在恰當?shù)臅r候,使用恰當?shù)乃惴?,才能合理完成業(yè)務邏輯
到此這篇關于Java利用策略模式實現(xiàn)條件判斷,告別if else的文章就介紹到這了,更多相關Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java IO學習之緩沖輸入流(BufferedInputStream)
這篇文章主要介紹了Java IO學習之緩沖輸入流(BufferedInputStream)的相關資料,需要的朋友可以參考下2017-02-02spring cloud gateway如何獲取請求的真實地址
這篇文章主要介紹了spring cloud gateway如何獲取請求的真實地址問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05@Valid 校驗無效,BindingResult未獲得錯誤的解決
這篇文章主要介紹了@Valid 校驗無效,BindingResult未獲得錯誤的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Springboot項目升級2.2.x升至2.7.x的示例代碼
本文主要介紹了Springboot項目升級2.2.x升至2.7.x的示例代碼,會有很多的坑,具有一定的參考價值,感興趣的可以了解一下2023-09-09mybatis-generator自動生成dao、mapping、bean配置操作
這篇文章主要介紹了mybatis-generator自動生成dao、mapping、bean配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08一小時迅速入門Mybatis之bind與多數(shù)據(jù)源支持 Java API
這篇文章主要介紹了一小時迅速入門Mybatis之bind與多數(shù)據(jù)源支持 Java API,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09springboot?靜態(tài)方法中使用@Autowired注入方式
這篇文章主要介紹了springboot?靜態(tài)方法中使用@Autowired注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02