1、前言
學習策略模式,對於大量的if else邏輯可以進行替換,使程式碼變得更加優雅簡潔。
2、編寫
①傳統if else
使用if else
對arg
進行判斷,對於不同的判斷進行不同的邏輯操作;
public class Simple {
void simple(String arg){
if ("1".equals(arg)){
//操作1
}else if ("2".equals(arg)){
//操作2
}
}
}
②策略模式(未完成版)
假設傳入level為vip等級,對於不同等級進行不同會員等級的操作
一.策略抽象介面
定義一個策略介面,不同VIP等級操作類實現該介面
public interface VIPStrategy {
public void handle();
}
二.策略實現類
一級VIP實現類:
public class VIP1StrategyImpl implements VIPStrategy{
@Override
public void handle() {
System.out.println("會員等級1");
}
}
二級VIP實現類:
public class VIP2StrategyImpl implements VIPStrategy{
@Override
public void handle() {
System.out.println("會員等級2");
}
}
三.策略工廠
透過level引數返回不同的策略實現類,進行操作
public class VIPStrategyFactory {
public static final Map<String,VIPStrategy> map=new HashMap<>();
static {
map.put("vip1",new VIP1StrategyImpl());
map.put("vip2",new VIP2StrategyImpl());
}
public static VIPStrategy getVipStrategy(String level) {
return map.get(level);
}
}
四.對比if else
public class NotGood {
void notGood(String arg){
VIPStrategy vipStrategy = VIPStrategyFactory.getVipStrategy(arg);
vipStrategy.handle();
}
}
③策略模式(完成版)
上面我們使用具體的VIPStrategy
實現類進行了處理,如果我們對VIP需要新增通用方法,可以使用上下文(裝飾器模式)封裝他們的通用處理:在execute執行方法中,新增通用操作:
public class VIPContext {
private VIPStrategy vipStrategy;
public VIPContext(VIPStrategy vipStrategy) {
this.vipStrategy = vipStrategy;
}
public void executeStrategy(){
System.out.println("VIP通用處理");
vipStrategy.handle();
}
}
編寫完成,簡單測試一下:
public class Good {
void good(String arg){
VIPStrategy vip1 = VIPStrategyFactory.getVipStrategy("vip1");
VIPContext vipContext = new VIPContext(vip1);
vipContext.executeStrategy();
}
public static void main(String[] args) {
Good good = new Good();
good.good("vip1");
}
}
3、總結
使用策略模式代替if else確實能讓程式碼的邏輯更加清晰,但是僅限於大量的if else,使用策略模式可以觀察到,程式碼量會急劇膨脹
我的建議:
1-3個分支:if else
3-5個分支:switch
更多:使用策略模式
不過還是看個人的喜好,按你的選擇即可