
<!-- more -->
## 关键词
我来整理一下策略模式(Strategy Pattern)相关的关键词和概念:
| 分类 | 关键词 | 说明 |
| ---- | ----------------- | --------------- |
| 核心角色 | Strategy | 策略接口,定义算法族的公共接口 |
| | ConcreteStrategy | 具体策略类,实现具体的算法 |
| | Context | 上下文,持有策略对象的引用 |
| | Client | 客户端,选择具体策略的使用者 |
| 策略选择 | SelectStrategy | 选择策略的方法 |
| | StrategyFactory | 策略工厂,创建策略对象 |
| | StrategyResolver | 策略解析器,根据条件选择策略 |
| | Default Strategy | 默认策略实现 |
| | Fallback Strategy | 降级策略实现 |
| 实现方式 | Composition | 组合方式实现 |
| | Delegation | 委托方式实现 |
| | Lambda/Function | 函数式实现 |
| | Enum Based | 枚举类型实现 |
| | Dynamic Strategy | 动态策略实现 |
| 配置管理 | Strategy Config | 策略配置 |
| | Strategy Mapping | 策略映射 |
| | Strategy Registry | 策略注册表 |
| | Strategy Cache | 策略缓存 |
| | Hot Reload | 热更新策略 |
## 场景
针对选货环节,有一下三种情况
- 风控用户,不选货,不定价
- 携程新套餐,不选货,直接定价
- 其他情况,正常选货,正常定价
## 实现
简单策略推荐枚举策略模式,复杂策略才推荐 [工厂模式](工厂模式.md)

```java
PriceService priceService = getPriceService(query, context);
![[
public PriceService getPriceService(HotelPriceQuery query, PriceEngineContext context) {
if (query.isFlagshipReq()) {
context.setNotUseGroupMemberProcess(true);
return flagShipService;
}
if (query.getChannelBiz() != null && FixPriceUtils.isFixPriceRequest(query.getChannelBiz())) {
return fixPriceService;
}
if (query.getChannelBiz() != null && StringUtils.equalsIgnoreCase(query.getChannelBiz().getId(), "hotelGroupService")) {
return hotelGroupService;
}
if (SearchRoomType.HourlyRoom.getType().equals(query.getSearchRoomType())) {
return hourlyChannelPriceService;
}
if (AdvanceSalePriceUtils.isAdvanceSaleRequest(query.getStoreCoupon())) {
String requestRoomId = Optional.ofNullable(query.getStoreCoupon().get(AdvanceSaleRequestKey.ROOMID))
.map(Object::toString).orElse(StringUtils.EMPTY);
if (StringUtils.isBlank(requestRoomId)) {
//请求roomId为空应该可以提前结束了,这里暂时加个监控
log.warn("advanceSaleRequestNoRoomId, hotelSeq:{}, fromDate:{}, toDate:{}", query.getHotelSeq(), query.getFromDate(),
query.getToDate());
QMonitor.recordOne("advanceSaleRequestNoRoomId");
}
context.setAdvanceSaleRoomId(requestRoomId);
return advanceSaleService;
}
//hds请求处理逻辑
if (query.getChannelBiz() != null && InnerChannelEnum.hds.name().equals(query.getChannelBiz().getId())) {
return hdsPriceService;
}
// 未登录用户
if (SpecialUserUtils.isUnLoginUser(query.getUserId(), query.getQueryEnum().getTag())) {
context.setNotUseGroupMemberProcess(true);
return specialUserPriceService;
}
// 风控用户
if (SpecialUserUtils.isRiskUser(NumberUtils.toInt(query.getIsCrawl(), 0), query.getQueryEnum().getTag())) {
context.setNotUseGroupMemberProcess(true);
context.setRiskUser(true);
return riskUserPriceService;
}
context.setMainProcess(true);
return mainPriceService;
}]]
```