1. 程式人生 > 實用技巧 >設計模式(一)之策略模式

設計模式(一)之策略模式

一.背景

進行業務程式碼編寫的時候,常常會出現兩條線,但是兩條線的大部分邏輯相同,僅是部分邏輯不一樣。此時若使用一個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"); } @Override
public 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)