前言
- 上篇文章介绍了策略模式的基本原理和实现机制 策略设计模式详解,但是我们在具体调用某一个策略时都是用new的方式来获取策略类实例。那这一点就spring的控制反转和依赖注入就设计思想就不符合。
- 那如何让spring容器机制管理具体的策略类,下面就一起看看吧。
具体项目中代码示例
- 在实际项目中可以把策略模式和spring整合在一起。
public interface AbstractAppPage<T> {
void insertOrUpdate(T t);
}
@Slf4j
@Service(AppPageRecord.FISH_CARD_PAGE)
public class CountFishCardBuriedPointServiceImpl implements AbstractAppPage<AppPageRecord> {
@Override
public void insertOrUpdate(AppPageRecord record) {
}
}
@Component
public class AppPageContextHandler {
private final static Map<String, AbstractAppPage> MAP = Maps.newConcurrentMap();
@Autowired
public AppPageContextHandler(Map<String, AbstractAppPage> map) {
MAP.clear();
MAP.putAll(map);
}
public void buildInsertOrUpdate(AppPageRecord record) {
if (null == record || StringUtils.isEmpty(record.getAppPageType())) {
return;
}
MAP.get(record.getAppPageType()).insertOrUpdate(record);
}
}
@Data
public class AppPageRecord {
public static final String FISH_CARD_PAGE = "fish_card_page";
private String appPageType;
}
@Slf4j
@Configuration
public class AppPageConsumer implements InitializingBean {
@Autowired
private AppPageContextHandler appPageContextHandler;
public void doConsume(String message) {
try {
AppPageRecord record = JSONObject.parseObject(message, AppPageRecord.class);
record.setAppPageType(AppPageRecord.FISH_CARD_PAGE);
appPageContextHandler.buildInsertOrUpdate(record);
} catch (Exception e) {
}
}
@Override
public void afterPropertiesSet() {
try {
} catch (Exception e) {
}
}
}
- 关于中间的AppPageContextHandler策略控制类处理器类其实是可以省略,在AppPageConsumer模拟业务调用策略类中直接使用下面这种方式也是可以的。具体操作就等读者自己思考。
@Autowired
private Map<String, AbstractAppPage> beanMap;
最后