設計模式(一)之策略模式
阿新 • • 發佈:2020-12-04
一.背景
進行業務程式碼編寫的時候,常常會出現兩條線,但是兩條線的大部分邏輯相同,僅是部分邏輯不一樣。此時若使用一個class或一條線,針對不同的邏輯就必須要 if-else來編寫。這種編寫方式的弊端:後續若再次出現一條線和已有的兩條線大部分邏輯相同,僅有部分邏輯不一樣,此時又需要在已有的程式碼中增加 if-else,一方面違背了開閉原則,另一方面程式碼可讀性較差,維護成本也會變大,同時一個類很有可能會出現爆炸的現象。
基於以上,建議使用策略模式。
二.示例
public interface IBaseInterface{ void menthod1(String strategyType)void menthod2(String strategyType) }
@Service("strategy1Service")
public class Strategy1 implements IBaseInterface{ private static final Logger log = LoggerFactory.getLogger(Strategy1 .class); @Override public void method1(String strategyType){ log.info("Strategy1 - method1"); } @Overridepublic void method2(String strategyType){ log.info("Strategy1 - method2"); } }
@Service("strategy2Service")
public class Strategy2 implements IBaseInterface{ private static final Logger log = LoggerFactory.getLogger(Strategy2.class); @Override public void method1(String strategyType){ log.info("Strategy2 - method1"); } @Override public void method2(String strategyType){ log.info("Strategy2 - method2"); } }
@Service("strategy3Service")
public class Strategy3 implements IBaseInterface{ private static final Logger log = LoggerFactory.getLogger(Strategy3.class); @Override public void method1(String strategyType){ log.info("Strategy3 - method1"); } @Override public void method2(String strategyType){ log.info("Strategy3 - method2"); } }
public enum StrategyEnum { STRATEGY1("1","strategy1Service"), STRATEGY2("2","strategy2Service"), STRATEGY3("3","strategy3Service") ; private String strategyType; private String beanName; private StrategyEnum (String strategyType,String beanName){ this.strategyType = strategyType; this.beanName = beanName; }
public static StrategyEnum findByBeanName(String beanName) {
for(StrategyEnum value:StrategyEnum.values()) {
if(value.getBeanName().equals(beanName)) {
return value;
}
}
return null;
}
private String getStrategyType(){ return strategyType; } private String getBeanName(){ return beanName; } }
public class StrategyManager{ @Autowired private ApplicationContext applicationContext; @Override public void method1(String strategyType){ IBaseInterface instance = findBean(strategyType); instance.method1(strategyType); } @Override public void method2(String strategyType){ IBaseInterface instance = findBean(strategyType); instance.method2(strategyType); } private IBaseInterface findBean(String strategyType){ StrategyEnum strategy = StrategyEnum.findByBeanName(strategyType); if(null != strategy) { return (IBaseInterface) applicationContext.getBean(strategy.getBeanName()); } throw NullPointerException(); } }
三.知識
1、UML圖
說明:
以上使用了兩種模式:門面模式 (遮蔽掉實現細節,外部只要使用該門面中的介面即可)+策略模式 (每個介面可以有不同的實現方式,根據需要選擇某種實現方式)
(1) strategy1、strategy2、strategy3均是三種不同的實現,其例項通過spring IOC儲存在 applicationContext中。
(2) strategyManager中會根據某個標記選擇不同的實現方式(strategy1或strategy2或strategy3)