縮減項目代碼中的大面積if策略

參考設計模式 - 策略模式咱們能夠優化if-else代碼段,而在Spring(Boot)中,藉助ApplicationContext掃描,能夠使代碼更加乾淨。

話很少說,亮代碼:java

首先按照策略模式的寫法,建立一個Handle接口,用於區分處理策略。

public interface ITypeHandle {
    /**
     * 不一樣的業務操做
     *
     * @return 對應的操做結果
     */
    String working();

    /**
     * 聲明用於處理的業務(方便查看而已)
     *
     * @return 業務名稱
     */
    String handleType();
}

而後建立對應的喚醒處理機和睡覺處理機

// 起牀操做
public class WakeTypeHandle implements ITypeHandle {
    @Override
    public String working() {
        try {
            // 模擬業務操做
            Thread.sleep(100);
        } catch (Exception ex) {
            return "Wake Interrupt";
        }
        return "Wake up Wake up Wake up";
    }

    @Override
    public String handleType() {
        return "wake";
    }
}
// 睡覺操做
public class SleepTypeHandle implements ITypeHandle {
    @Override
    public String working() {
        try {
            // 模擬業務操做
            Thread.sleep(500);
        } catch (Exception ex) {
            return "Sleep Interrupt";
        }
        return "Sleep Sleep Sleep Zzzzzzzzzzzzz";
    }

    @Override
    public String handleType() {
        return "sleep";
    }
}

簡單來講,策略模式的操做方式是經過上下文切換不一樣的處理機來處理不一樣的業務。在Spring中,能夠藉助ApplicationContext和ComponentScan來完成。spring

創建策略工廠

public class TypeHandleFactory {
    private Map<String , ITypeHandle> map;

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    private void init(){
        Map<String ,ITypeHandle> beans=applicationContext.getBeansOfType(ITypeHandle.class);
        map= new HashMap<>(beans.size());
        for (ITypeHandle handle : beans.values()) {
            map.put(handle.handleType(),handle);
        }
    }
    public ITypeHandle getInstance(String type){
        return map.get(type);
    }
}

這裏的初始化應當在ApplicationContext注入完成後進行,所以添加@PostConstruct註解。在Spring中,類執行主要註解的順序爲構造方法=>@Autowired=>@PostConstruct=>@PreDestroy=>銷燬。另外須要在策略工廠和兩個處理機上添加@Component註解或由@ComponentScan掃描。

添加一個Service類來模擬業務層:

@Service
public class MainServiceImpl {
    @Autowired
    private TypeHandleFactory factory ;
    @Override
    public String work(String type){
        ITypeHandle handler = factory.getInstance(type);
        return handler.working();
    }
}

至此,咱們已經完成了策略模式在Spring中的構建。能夠編寫測試類測試:設計模式

@SpringBootTest
class MainServiceImplTest {
    @Autowired
    private MainServiceImpl service;
    @Test
    void work(){
        String typeA="wake";
        String typeB="sleep";
        System.out.println(service.work(typeA));
        System.out.println(service.work(typeB));
    }
}

日誌打印爲:springboot

Wake up Wake up Wake up
Sleep Sleep Sleep Zzzzzzzzzzzzz

策略模式在Spring中的優化完成。app

相關文章
相關標籤/搜索