详解设计模式 责任链模式

360 阅读4分钟

责任链模式

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

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

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

模式类图

角色

  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