归因组件ACE:订单归类技术解决方案( 三 )
定义嵌套分类器 CLASSIFIER_NEST, 绑定原子分类器 CLASSIFIER_X 和 CLASSIFIER_Y, CLASSIFIER_X 优先级高于 CLASSIFIER_Y。
/** * 嵌套分类器示例 * priority:表示绑定的原子分类器的优先级规则 * @author haoyu.chy * @date 2020/9/5 */@Classifier(name = "CLASSIFIER_NEST", priority = "CLASSIFIER_X,CLASSIFIER_Y")public class Classifier_Nest implements NestedClassifier {}
3)定义执行器
定义原子分类器 CLASSIFIER_X 对应的执行器 ExecutorX。
/** * 执行器示例* 注:执行器名称对应分类器名称 * @author haoyu.chy * @date 2020/9/5 */@Executor(name = "CLASSIFIER_X")public class ExecutorX implements IExecutor {@Overridepublic AceResult execute(AceContext aceContext) {// do something ...return new AceResult();}}
4)定义服务入口
定义归因服务入口 , 指定归因场景 aceScene 和归因对象 aceObject , 借助 AceWorker 完成归因工作 。
/** * 归因服务入口示例 * @author haoyu.chy * @date 2020/9/5 */public class SimpleService {public static void main(String[] args) {// 归因场景(例如 , CLASSIFIER_NEST)String aceScene = "CLASSIFIER_NEST";// 被归因对象(例如 , 订单号)Long aceObject = 1234567890L;// 初试化上下文AceContext
? 天猫优品导购归因天猫优品导购订单类型举例:
- 权益券导购订单:订单存在权益券使用记录
- 天猫优品普通导购订单:天猫优品商品且最近一次导购记录为普通导购
- 天猫优品淘花导购订单:天猫优品商品且最近一次导购记录为淘花导购
- 优先级规则:权益券导购优先级最高 , 普通导购和淘花导购优先级并列(最近原则)
- 互斥规则:天猫优品定向优惠订单、本地履约订单、代购订单优先级高于所有类型导购订单
文章插图
图 6 :天猫优品导购归因流程
Step 1 :定义属性校验器
属性校验器相互独立 , 表示是否满足某种属性 。 例如 , 定义属性校验器(Attributor):天猫优品商品标、权益导购券、普通导购记录、淘花导购记录、定向优惠、本地履约等 。
Step 2:定义原子分类器
原子分类器绑定多个属性校验器 , 表示是否满足某种类型 。 例如 , 定义分类器(Classifier):权益券导购订单(COUPON_GUIDE)、普通导购订单(NORMAL_GUIDE)和淘花导购订单(SUPERB_GUIDE) 。 其中 , 权益券导购订单(COUPON_GUIDE)绑定权益导购券属性 , 过滤定向优惠和本地履约等属性 。
注:图 6 实线表示满足 , 虚线表示过滤
Step 3:定义嵌套分类器
嵌套分类器绑定多个原子分类器 , 一般用于优先级决策场景 , 按前后顺序匹配第一个有效分类器 。 例如 , 定义嵌套分类器(GUIDE_ORDER) , 其绑定原子分类器(COUPON_GUIDE、NORMAL_GUIDE 和 SUPERB_GUIDE) , 优先级从前往后 。
Step 4:定义执行器
每个原子分类器对应一个执行器 。 如果某个分类器有效 , 则执行对应的执行器 。
Step 5:定义服务入口
定义 ACE 组件后 , 只需指定归因场景(对应分类器名称)和归因对象 , 即可使用归因服务 。 例如 , 归因场景为导购归因(GUIDE_ORDER) , 归因对象为某个订单 , 则表示对某个订单执行导购归因 。
基于 ACE 组件 , 定义属性校验器、分类器和执行器 , 封装服务接口 。 天猫优品导购归因代码框架如图 7。
文章插图
图 7 :天猫优品导购归因代码框架
效果分析
? 遵循 SOLID 原则单一责任原则(SRP):每个 ACE 组件只负责一种职责 。 Attributor 只判断是否满足某种属性 , Classifier 只判断是否满足某种类型 , Executor 只对某种类型执行处理 。
开放关闭原则(OCP):ACE 组件之间相互独立 。 新增属性或分类无需修改原有组件 , 只需定义一种新的属性校验器或分类器即可 , 完全无需改动原有代码 。
里氏替换原则(LSP):父类可用子类替代 , 子类只扩展父类方法 , 不重写父类方法 。 ACE 基于接口实现 , 不重写已实现方法 。
接口隔离原则(ISP):子类不被迫依赖它不需要的方法 。 ACE 组件接口相互独立 , 且只提供唯一方法 。
依赖倒置原则(DIP):ACE 组件面向接口编程 , 基于 ACE 工厂容器实现依赖注入 , 组件间不存在直接依赖关系 。
- Facebook|谷歌、Facebook未来几周将面临更多的反垄断诉讼
- 审查|Facebook超10亿美元收购Kustomer 该交易仍面临审查
- Twitter|Twitter的Audio Spaces测试包括转录、扬声器控制和报告功能
- 买下|罕见收购!Facebook花10亿多美金买下了一家ToB公司
- 反垄断|谷歌和Facebook或于明年1月在美面临新的反垄断诉讼
- realme官宣新旗舰“Race”将是首批搭载骁龙888机型
- 征收|加拿大计划2022年起对Facebook、谷歌等科技巨头征收数字税
- 权威|扎克伯格:Facebook将提供新冠疫苗权威信息
- 「第三期」 iOS 14 实用小组件合集,你最喜欢哪一个?
- 大小公司都适用的架构选型工具箱(涵盖上百个组件)