话很少说,亮代码: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