责任链模式
责任链模式属于行为型模式
定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止
每个对象持有对下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求.
模式类图
角色
- 抽象处理接口:Handler
- 具体处理类: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);
}
抽象类
继承Handler
,getUserLevel()
交由子类实现,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
来源:CSDN
作者:我是树懒
链接:https://blog.csdn.net/qq_35783095/article/details/103773772