1. 程式人生 > 其它 >工廠模式+策略模式

工廠模式+策略模式

技術標籤:java設計模式

場景

目前遇到這樣一個場景,就是會根據前端不同的傳值執行對應的方法策略。按照正常思路,需要在程式碼中使用if判斷前端的值來執行不同的方法。但這樣做的缺點是會造成大量if判斷,且下次新增加一個值對應一個策略,那麼就需要改動程式碼。

解決

對於這種根據值來執行不同策略的場景,可以使用工廠模式+策略模式來解決。
在這裡插入圖片描述

既然有策略,那麼我們就需要定義一個策略介面或策略抽象類。

public interface Strategy{
 	 void doOperation();
     String getStrategyName();
}

定義具體策略類,這裡定義了兩個策略類

@Component
public class StrategyA implements Strategy{
 	@Override
    public void doOperation(){
    	System.out.println("執行策略a");
    }
    @Override
    public String getStrategyName(){
     	return "strategyA";  //此處是該策略對應前端傳的值,   
    }    
}    
@Component
public class StrategyB
implements Strategy{ @Override public void doOperation(){ System.out.println("執行策略b"); } @Override public String getStrategyName(){ return "strategyB"; //此處是該策略對應前端傳的值, } }

定義工廠介面

public interface Factory{
 	Strategy createStrategy(String strategyName)
; void registerStrategy(Strategy strategy); }

具體策略工廠

@Component
public class StrategyFactory implements Factory{
    // 該map用來存放策略名和對應策略類
    private Map<String,Strategy> map= new ConcurrentHashMap<String,Strategy>();
 	 @Override
    public Strategy createStrategy(String strategyName){
     	return map.get(strategyName);   
    }
    // 註冊策略類到工廠的map中
    @Override
    public void registerStrategy(Strategy strategy){
        map.put(strategy.getStrategyName(), strategy);
    }
}

在這裡我們需要將策略類放入工廠的map集合中,所以需要有一個註冊策略類的步驟,使用spring boot我們可以監聽容器事件來註冊

@Component
public class StartAction implements ApplicationListener<ContextRefreshedEvent>
{
    @Autowired
    private Factroy factory;
    
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event)
    {
        Map<String, Strategy> map = event.getApplicationContext()
                .getBeansOfType(Strategy.class);
        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext())
        {
            String key = iterator.next();
            Strategy strategy = map.get(key);
            factory.registerStrategy(strategy);
        }   
    } 
}

經過以上步驟我們的所有準備都完成,接下來就可以使用

// 當strategyName的值不同時,會獲取到不同的策略例項。當我們要新增一個策略時,只需實現Strategy介面 
Strategy strategy = factory.createStrategy(strategyName);
 strategy.doOperation();