話很少說,亮代碼:java
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); } }
@PostConstruct
註解。在Spring中,類執行主要註解的順序爲構造方法=>@Autowired=>@PostConstruct=>@PreDestroy=>銷燬
。另外須要在策略工廠和兩個處理機上添加@Component
註解或由@ComponentScan
掃描。@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