Java利用策略模式實(shí)現(xiàn)條件判斷,告別if else
定義
策略模式定義了一系列算法,并且將每個(gè)算法封裝起來(lái),使得他們可以相互替換,而且算法的變化不會(huì)影響使用算法的客戶端。
使用場(chǎng)景
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)的在幾種算法中選擇一種,可以把每個(gè)算法封裝到具體的策略類中
- 一個(gè)類中定義了多種行為,可以去代替條件轉(zhuǎn)移語(yǔ)句,減少硬編碼
- 系統(tǒng)中各個(gè)算法或者說(shuō)函數(shù)是彼此獨(dú)立的,而且要求對(duì)客戶隱藏算法具體實(shí)現(xiàn)細(xì)節(jié)的時(shí)候
- 多個(gè)類只區(qū)別在表現(xiàn)行為的不同,可以使用策略模式,在運(yùn)行時(shí)動(dòng)態(tài)的選擇要執(zhí)行的行為
案例
需求
根據(jù)不同的水果口味,制作不同的蛋糕,比如現(xiàn)在有蘋果味和香蕉味的蛋糕,入?yún)樘O果味,則制作蘋果味蛋糕;入?yún)橄憬段?,則制作香蕉味的蛋糕
實(shí)現(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("正在制作香蕉蛋糕");
}
}定義枚舉類,來(lái)制作蛋糕的策略
/**
* 制作蛋糕枚舉
* @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;
}
}
定義測(cè)試類
/**
* 測(cè)試類
* @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();
}
}查看測(cè)試結(jié)果

方案分析
通過(guò)該案例的實(shí)現(xiàn),我們可以看到,使用策略模式+枚舉,替換掉了if--else的硬編碼,并且把不同的策略封裝到了單獨(dú)的實(shí)現(xiàn)類中,防止一個(gè)策略出現(xiàn)問(wèn)題后影響到其他的策略,提高了系統(tǒng)的可擴(kuò)展性,最大程度上實(shí)現(xiàn)了開閉原則。
總結(jié)
優(yōu)勢(shì)
- 多重條件語(yǔ)句屬于硬編碼不易維護(hù),而使用策略模式可以避免使用多重條件語(yǔ)句
- 策略模式提供了一系列算法,恰當(dāng)?shù)氖褂美^承或者實(shí)現(xiàn),可以把算法族里面的公共代碼提到父類里面。這樣就會(huì)避免重復(fù)的代碼
- 策略模式可以提供相同行為的不同實(shí)現(xiàn),客戶端可以根據(jù)具體的業(yè)務(wù)邏輯去選擇合適的
- 策略模式完美契合開閉原則,可以在不修改或者少修改源代碼的情況下,靈活增加、減少、修改新 算法
- 策略模式把算法的使用放到環(huán)境類中,而算法的實(shí)現(xiàn)在具體策略類中,實(shí)現(xiàn)了二者的分離
劣勢(shì)
- 在實(shí)際業(yè)務(wù)邏輯非常復(fù)雜的情況下,會(huì)導(dǎo)致出現(xiàn)很多策略類
- 客戶端必須在恰當(dāng)?shù)臅r(shí)候,使用恰當(dāng)?shù)乃惴?,才能合理完成業(yè)務(wù)邏輯
到此這篇關(guān)于Java利用策略模式實(shí)現(xiàn)條件判斷,告別if else的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中使用雙向鏈表實(shí)現(xiàn)貪吃蛇程序源碼分享
這篇文章主要介紹了java中使用雙向鏈表實(shí)現(xiàn)貪吃蛇程序源碼分享,本文直接給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03
解決阿里云OSS使用URL無(wú)法訪問(wèn)圖片的兩種方法
這篇文章主要介紹了解決阿里云OSS使用URL無(wú)法訪問(wèn)圖片的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法
LinkedList是由傳統(tǒng)的鏈表數(shù)據(jù)結(jié)構(gòu)演變而來(lái)的,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu),它可以動(dòng)態(tài)地增加或刪除元素,下面這篇文章主要給大家介紹了關(guān)于Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-05-05
IDEA中 Getter、Setter 注解不起作用的問(wèn)題如何解決
這篇文章主要介紹了IDEA中 Getter、Setter 注解不起作用的問(wèn)題如何解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Spring中@Import的各種用法以及ImportAware接口詳解
這篇文章主要介紹了Spring中@Import的各種用法以及ImportAware接口詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒
這篇文章主要介紹了基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

