介绍
我之前写过写过一篇策略模式的实现
项目中的if else太多了,该怎么重构?
用了注解+ApplicationListener来将映射关系保存在map中,有没有更简洁的方式呢?当然有!但是需要借助spring
策略模式本质上就是一个接口+多个实现类,根据不同的条件选择不同的实现类
策略接口
public interface MsgService {
void handleMessage();
}
@Service
public class ImageMsgService implements MsgService {
@Override
public void handleMessage() {
System.out.println("handler image");
}
}
@Service
public class TextMsgService implements MsgService {
@Override
public void handleMessage() {
System.out.println("handler text");
}
}
测试类如下
@RunWith(SpringRunner.class)
@SpringBootTest
public class StrategyTest {
/**
* 启动后map中的元素为beanName->MsgService对应的实现类
* imageMsgService -> ImageMsgService
* textMsgService -> TextMsgService
*/
@Autowired
private Map<String, MsgService> handlerMap;
/**
* 测试输出
* handler image
*/
@Test
public void test() {
String msgType = "image";
// 实际项目中,选择哪个实现类的判断条件可能比较复杂
if (msgType.equals("image")) {
handlerMap.get("imageMsgService").handleMessage();
} else if (msgType.equals("text")) {
handlerMap.get("textMsgService").handleMessage();
}
}
}