spring版本策略模式(超實用)
策略模式:顧名思義,按照不同的情況選擇對應(yīng)的對策略的模式
設(shè)計,策略對應(yīng) code枚舉,決策謀略對應(yīng)不同的類的執(zhí)行方法,往下看
直接上代碼
策略處理器枚舉
/**
* 描述: 策略處理器枚舉 </br>
* 時間: 2022-01-15 14:03 </br>
* 作者:it學(xué)習(xí)道場
*/
public enum HandlerEnum {
first(1,"第一個處理器"),
second(2,"第二個處理器"),
third(3,"第三個處理器")
;
private int code;
private String desc;
HandlerEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "HandlerEnum{" +
"code=" + code +
", desc='" + desc + '\'' +
'}';
}
}
策略模式頂級處理器抽象
/**
* 描述: 策略模式頂級處理器抽象 </br>
* 時間: 2022-01-15 14:01 </br>
* 作者:it學(xué)習(xí)道場
*/
public interface Handler {
/**
* 執(zhí)行業(yè)務(wù)邏輯抽象方法
* @return
*/
boolean handle();
/**
* 獲取code方法
* @return
*/
int getCode();
}
第一個處理器
import org.springframework.stereotype.Component;
/**
* 描述: 第一個處理器 </br>
* 時間: 2022-01-15 14:13 </br>
* 作者:it學(xué)習(xí)道場
*/
@Component
public class FirstHandler implements Handler {
private static final int code = HandlerEnum.first.getCode();
@Override
public boolean handle() {
System.out.println(HandlerEnum.first.getDesc() + "開始執(zhí)行業(yè)務(wù)......");
return true;
}
@Override
public int getCode() {
return code;
}
}
第二個處理器
import org.springframework.stereotype.Component;
/**
* 描述: 第二個處理器 </br>
* 時間: 2022-01-15 14:13 </br>
* 作者:it學(xué)習(xí)道場
*/
@Component
public class SecondHandler implements Handler {
private static final int code = HandlerEnum.second.getCode();
@Override
public boolean handle() {
System.out.println(HandlerEnum.second.getDesc() + "開始執(zhí)行業(yè)務(wù)......");
return true;
}
@Override
public int getCode() {
return code;
}
}
第三個處理器
import org.springframework.stereotype.Component;
/**
* 描述: 第三個處理器 </br>
* 時間: 2022-01-15 14:13 </br>
* 作者:it學(xué)習(xí)道場
*/
@Component
public class ThirdHandler implements Handler {
private static final int code = HandlerEnum.third.getCode();
@Override
public boolean handle() {
System.out.println(HandlerEnum.third.getDesc() + "開始執(zhí)行業(yè)務(wù)......");
return true;
}
@Override
public int getCode() {
return code;
}
}
策略工廠
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 描述: 策略工廠 </br>
* 時間: 2022-01-15 14:17 </br>
* 作者:it學(xué)習(xí)道場
*/
@Component
public class StrategyFactory {
@Autowired
private Map<String, Handler> handlerBeanMap = new ConcurrentHashMap<>();
/**
* 根據(jù)code獲取對應(yīng)處理器
* @param code handler的code碼
* @return Handler - 處理器
*/
public Handler getHandler(int code){
for (String beanName : handlerBeanMap.keySet()) {
Handler handler = handlerBeanMap.get(beanName);
if (handler.getCode() == code){
return handler;
}
}
return null;
}
}
測試
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* 描述: 工廠處理器測試 </br>
* 時間: 2022-01-15 14:24 </br>
* 作者:it學(xué)習(xí)道場
*/
public class StrategyTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(StrategyFactory.class,FirstHandler.class,SecondHandler.class,ThirdHandler.class);
context.refresh();
StrategyFactory bean = context.getBean(StrategyFactory.class);
//1-對應(yīng)第一個處理器,2-對應(yīng)第二個處理器,3-對應(yīng)第三個處理器
Handler handler = bean.getHandler(HandlerEnum.first.getCode());
handler.handle();
}
}
自己來測試下吧
作者:IT學(xué)習(xí)道場
歡迎關(guān)注微信公眾號 : IT學(xué)習(xí)道場