![image.png|1000](https://imagehosting4picgo.oss-cn-beijing.aliyuncs.com/imagehosting/fix-dir%2Fpicgo%2Fpicgo-clipboard-images%2F2024%2F05%2F09%2F21-59-11-5f6779e792be0e23e156e8f6b6b16723-20240509215910-8a13f2.png) <!-- 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) ![image.png|1000](https://imagehosting4picgo.oss-cn-beijing.aliyuncs.com/imagehosting/fix-dir%2Fpicgo%2Fpicgo-clipboard-images%2F2024%2F05%2F09%2F22-51-22-35cba26b11c40367e9b419a5d56321fe-20240509225121-e49006.png) ```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; }]] ```