简单策略设计模式详解
具体项目中代码示例
- 在实际项目中可以把策略模式和spring整合在一起。
/**
* 策略顶级接口
*
* @Author: ZRH
* @Date: 2020/12/23 12:00
*/
public interface AbstractAppPage<T> {
/**
* 策略实现的抽象方法
*
* @param t
*/
void insertOrUpdate(T t);
}
/**
* 策略实现类,并自定义Bean名
*
* @author: ZRH
* @vesion: 1.2.0
* @time: 2020/12/23 19:06
*/
@Slf4j
@Service(AppPageRecord.FISH_CARD_PAGE)
public class CountFishCardBuriedPointServiceImpl implements AbstractAppPage<AppPageRecord> {
@Override
public void insertOrUpdate(AppPageRecord record) {
// TODO
}
}
/**
* 策略控制类处理器
*
* @Author: ZRH
* @Date: 2020/12/23 13:41
*/
@Component
public class AppPageContextHandler {
/**
* 存放抽象类集合
*/
private final static Map<String, AbstractAppPage> MAP = Maps.newConcurrentMap();
/**
* 使用@Autowired注解在构造方法上,spring会自动扫描符合的Bean到map容器中,key为bean名称,value为bean实例
*
* @param map
*/
@Autowired
public AppPageContextHandler(Map<String, AbstractAppPage> map) {
MAP.clear();
MAP.putAll(map);
}
/**
* 根据自定义条件找到bean并执行策略
*/
public void buildInsertOrUpdate(AppPageRecord record) {
if (null == record || StringUtils.isEmpty(record.getAppPageType())) {
return;
}
MAP.get(record.getAppPageType()).insertOrUpdate(record);
}
}
/**
* 配置的bean名称实体类
*
* @Author: ZRH
* @Date: 2020/12/23 10:21
*/
@Data
public class AppPageRecord {
/**
* CountFishCardBuriedPointServiceImpl - beanName
*/
public static final String FISH_CARD_PAGE = "fish_card_page";
/**
* 埋点类型
*/
private String appPageType;
// other
}
/**
* 模拟业务调用策略类
*
* @author: zrh
* @vesion: 1.2.0
* @time: 2020/12/23
*/
@Slf4j
@Configuration
public class AppPageConsumer implements InitializingBean {
@Autowired
private AppPageContextHandler appPageContextHandler;
public void doConsume(String message) {
try {
AppPageRecord record = JSONObject.parseObject(message, AppPageRecord.class);
// 模拟添加beanName
record.setAppPageType(AppPageRecord.FISH_CARD_PAGE);
// 保存或修改记录
appPageContextHandler.buildInsertOrUpdate(record);
} catch (Exception e) {
}
}
@Override
public void afterPropertiesSet() {
try {
// doSomeThing
} catch (Exception e) {
}
}
}
- 上面是我在实际项目中对策略模式的实现,具体业务需求代码已经清理。读者可以根据自身业务对上面代码进行改造使用。