设计模式-05

举报
kwan的解忧杂货铺 发表于 2024/05/15 06:37:45 2024/05/15
【摘要】 五.投放模块 1.责任链模式模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式的核心在“链”上,“链”是由多个处理者 ConcreteHandler 组成的。责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统...

五.投放模块

1.责任链模式

模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

责任链模式的核心在“链”上,“链”是由多个处理者 ConcreteHandler 组成的。

责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。

责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不很方便,特别是链条比较长,环节比较多的时候。

image-20230729180010962

2.责任链官方编码

//定义一个抽象的handle
public abstract class Handler {
    private Handler nextHandler;  //指向下一个处理者

    private int level;  //处理者能够处理的级别。代表一些扩展的可能性

    public Handler(int level) {
        this.level = level;
    }

    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }

    // 抽象方法,子类实现
    public abstract void echo(Request request);
}
// 定义一个具体的handleA
public class HandleRuleA extends Handler {
    public HandleRuleA(int level) {
        super(level);
    }

    @Override
    public void echo(Request request) {
        System.out.println("我是处理者1,我正在处理A规则");
    }
}

//定义一个具体的handleB
public class HandleRuleB extends Handler {
}  //...
//客户端实现
class Client {
    public static void main(String[] args) {
        HandleRuleA handleRuleA = new HandleRuleA(1);
        HandleRuleB handleRuleB = new HandleRuleB(2);
        handleRuleA.setNextHandler(handleRuleB);  //这是重点,将handleA和handleB串起来
        handleRuleA.echo(new Request());
    }
}

3.投放业务需求

使用责任链模式实现投放业务的需求:

项目需求:付款完成后的投放业务,投放业务就是要在这些资源位中展示符合当前用户的资源。在支付成功页筛选活动 banner 和推荐商品。

要求:

  1. 允许运营人员配置需要展示的资源,以及对资源进行过滤的规则。
  2. 资源的过滤规则相对灵活多变,这里体现为三点:
    • 过滤规则大部分可重用,但也会有扩展和变更。
    • 不同资源位的过滤规则和过滤顺序是不同的。
    • 同一个资源位由于业务所处的不同阶段,过滤规则可能不同。
  3. 允许规则实时增减和顺序调整。(使用责任链的核心原因)

过滤规则:

  1. 用户个人资质是否满足投放业务;
  2. 用户所在城市是否在业务投放城市;
  3. 用户近期所购买的产品是否符合业务投放人群;
  4. 新用户首次购买投放指定业务。

image-20230729175912129

4.责任链实际编码

代码地址

image-20230729180333412

5.责任链模式总结

  1. 编写抽象 handler;
  2. 编写各个逻辑 handler,继承抽象 handler,并重写方法,满足自己的校验条件;
  3. 在配置中心,配置相关的 handler;
  4. 处理器封装,集中处理各种策略,只对面提供封装后的处理器;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。