找回密码
 会员注册
查看: 35|回复: 0

责任链模式在转转精准估价中的应用

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-20 05:00:19 | 显示全部楼层 |阅读模式
一、业务简介二、早期遇到的问题三、责任链四、实战应用五、总结一、业务简介转转线上C2B回收业务,主要是针对3C数码产品进行回收。而用户在下单前,通过填写机器信息获取预估报价的过程,即精准估价。精准估价作为回收流程的第一步,对业务来说是较为重要的。常规估价流程二、早期遇到的问题粗糙:初期粗糙的产品模式衍生了粗糙的代码,对于后续的扩展和维护造成困难。//判断是新用户发放加价红包if(newUser) { sendCoupon();}//数码走单独的报价逻辑if(shuma) { shumaPrice();}//手机走单独的报价逻辑if(shouji) { shoujiPrice();}//处理异常数据if(price == null) { return 兜底数值;}变化快:核心节点,产品的迭代频繁,因为较低的维护性改起来较痛苦。逻辑复杂:场景多、系统多、报价方多、计算逻辑复杂等。导致整体复杂度较高。性能问题:当报价的能力被使用到更多业务场景后,对于系统性能也有不小的挑战。因此需要对模块进行重新设计三、责任链什么是责任链:责任链模式(ChainofResponsibilityPattern):责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。为什么选择使用责任链重写业务代码?先看看责任链模式的特点责任链的优点:单一职责:⼀个类和⽅法只做⼀件事。降低了耦合度,调用方不需要知道请求由哪些handler处理,而handler也不需要知道互相之间的传递关系,由系统组织和分配。开闭原则:一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。带来良好的扩展性,使得增加处理者的实现很简单,可以在链路中任意位置插入新的handler。责任链的缺点:链路长:请求从链头发出,直到被中断或者结束,可能会影响系统性能。排查较慢:一般是不太能一目了然的看到是哪个节点出现了问题,需要多添加一些核心日志。再看看较为常见的估价流程特点:链式结构每个模块职责单一通过比较业务的特点和责任链的特点,可以看出是较为契合的。所以选择以责任链模式为基础,开始重写业务逻辑。四、实战应用首先定义抽象处理者,可以是接口或者是抽象类,或者二者结合。定义好需要每个处理者实现的功能。public interface ValuationResponsibilityChainHandle {    /**     * 处理     * @param context     * @param request     * @param response     */    void handle(ChainResponsibilityContext context, ChainResponsibilityRequest request, ChainResponsibilityResponse response);  /**     * 设置下一个责任处理器     * @param nextHandle     */    void setNextHandler(ValuationResponsibilityChainHandle nextHandle);    /**     * 获取下一个责任处理器     * @return     */    ValuationResponsibilityChainHandle  getNextHandler();}处理者负责实现抽象处理者。用黑名单校验模块的举例。public class BlacklistHandler extends AbstractValuationChainValuationResponsibilityHandle {    @Autowired    private ValuationApolloService valuationApolloService;    @Override    public void handle(ValuationContext context, ValuationRequest request, BmDealPriceDto bmDealPriceDto) {        log.info("精准估价-黑名单校验, context={}, bmDealPriceDto={}", context, bmDealPriceDto);        if(Objects.isNull(request.getUid())) {            return;        }        if(!valuationApolloService.getBmValuationBlackList().contains(request.getUid())) {            return;        }        context.setSkipNode(true);   //找下个处理者        this.invokeNext(context, chainResponsibilityRequest,chainResponsibilityResponse);    } //设置下一个处理者    @Override    public void setNextHandler(ValuationResponsibilityChainHandle nextHandler) {        this.nextHandler = nextHandler;    }}初始化黑名单模块,一个简单的责任链就可以跑起来了。public static void main(String[] args) {        BlacklistHandler blacklistHandler = new BlacklistHandler();        blacklistHandler.handle();    }但是,如何动态组装责任链?上述的方式每一个处理者和下个处理者的关系是固定的,没有办法根据入参去做动态的组装,需要进行一些调整。责任链+建造者我们定义一个内部的Builder类,负责通过场景类型给到我们对应的整组责任链。调用方请求时,根据场景获取链路类型。private int getChainType(String params1, String params2) {        //根据参数组装出场景key        String mapKey = params1 + params2;    //从配置中获取到key对应的链路类型        return BuildChainConstant.CHAIN_MAP.getOrDefault(key, -1);    }根据获取到的链路类型获取指定的责任链。   //根据类型找链路 public List
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-25 13:24 , Processed in 0.916901 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表