详解设计模式 责任链模式

责任链模式

责任链模式属于行为型模式

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

每个对象持有对下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求.

模式类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChbA1j2K-1577711777047)(design-chain/uml.png)]

角色

  1. 抽象处理接口:Handler
  2. 具体处理类:ConcreteHandler
优点

将请求与处理分开,请求者可以不用知道到底是需要谁来处理的,两者解耦,提高系统灵活性,增加新的请求处理类很方便

缺点

当调用链比较长的时候,调试不方便,写代码时要注意避免循环调用

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

以用户注册为例,注册方式分为普通用户注册和Vip用户注册,使用责任链模式将两种注册方式链起来

抽象处理接口

抽象接口定义了两个方法:用户注册方法,责任链调用方法

/**
 * @author: chenmingyu
 * @date: 2019/3/22 20:32
 * @description:
 */
public interface Handler {

    /**
     * 注册操作
     * @param userName 用户名
     */
    String operator(String userName);

    /**
     * 责任链调用处理逻辑
     *      如果可以自己处理则自己处理,如果处理不了,交由下一个处理类处理
     * @param level
     * @param userName
     * @return
     */
    String handleMessage(Integer level,String userName);
}

抽象类

继承HandlergetUserLevel()交由子类实现,handleMessage(Integer level,String userName)用final修饰,子类无法重写责任链调用的处理逻辑

/**
 * @author: chenmingyu
 * @date: 2019/3/23 10:42
 * @description: 抽象类
 */
@Data
public abstract class AbstractHandle implements Handler {

    /**
     * 下一个处理器
     */
    public Handler nextHandler;

    /**
     * 获取用户等级
     * @return
     */
    protected abstract Integer getUserLevel();

    @Override
    public final String handleMessage(Integer level,String userName){
        String result = "";
        if(this.getUserLevel().equals(level)){
            result = this.operator(userName);
        }else{
            result = this.nextHandler.handleMessage(level,userName);
        }
        return result;
    }
}
具体实现类

普通会员

/**
 * @author: chenmingyu
 * @date: 2019/3/23 10:46
 * @description: 普通用户注册
 */
@Data
public class UserRegisterHandle extends AbstractHandle {

    /**
     * 普通会员
     */
    public Integer ordinaryLevel = 1;

    @Override
    public String operator(String userName) {
        System.out.println("普通会员注册:"+userName);
        return userName;
    }

    @Override
    protected Integer getUserLevel() {
        return ordinaryLevel;
    }
}

vip会员

/**
 * @author: chenmingyu
 * @date: 2019/3/23 11:02
 * @description: vip会员注册
 */
public class VIPUserRegisterHandle extends AbstractHandle {

    /**
     * VIP会员
     */
    public Integer VIPLevel = 2;

    @Override
    public String operator(String userName) {
        System.out.println("VIP会员注册:"+userName);
        return userName;
    }

    @Override
    protected Integer getUserLevel() {
        return VIPLevel;
    }
}
验证
public static void main(String[] args) {

    UserRegisterHandle userRegisterHandle = new UserRegisterHandle();
    VIPUserRegisterHandle vipUserRegisterHandle = new VIPUserRegisterHandle();
    userRegisterHandle.setNextHandler(vipUserRegisterHandle);

    userRegisterHandle.handleMessage(2,"mingyu");
    userRegisterHandle.handleMessage(1,"mingyu");
}

输出

VIP会员注册:mingyu
普通会员注册:mingyu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值