设计模式-05
【摘要】 五.投放模块 1.责任链模式模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式的核心在“链”上,“链”是由多个处理者 ConcreteHandler 组成的。责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统...
五.投放模块
1.责任链模式
模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式的核心在“链”上,“链”是由多个处理者 ConcreteHandler 组成的。
责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不很方便,特别是链条比较长,环节比较多的时候。
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 和推荐商品。
要求:
- 允许运营人员配置需要展示的资源,以及对资源进行过滤的规则。
- 资源的过滤规则相对灵活多变,这里体现为三点:
- 过滤规则大部分可重用,但也会有扩展和变更。
- 不同资源位的过滤规则和过滤顺序是不同的。
- 同一个资源位由于业务所处的不同阶段,过滤规则可能不同。
- 允许规则实时增减和顺序调整。(使用责任链的核心原因)
过滤规则:
- 用户个人资质是否满足投放业务;
- 用户所在城市是否在业务投放城市;
- 用户近期所购买的产品是否符合业务投放人群;
- 新用户首次购买投放指定业务。
4.责任链实际编码
5.责任链模式总结
- 编写抽象 handler;
- 编写各个逻辑 handler,继承抽象 handler,并重写方法,满足自己的校验条件;
- 在配置中心,配置相关的 handler;
- 处理器封装,集中处理各种策略,只对面提供封装后的处理器;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)