责任链模式:Chain Of Responsibility,为请求创建了一个接受者对象的链,使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系
应用场景:一个请求的处理需要多个对象当中的一个或多个协作处理
优点:
- 请求的发送者和接受者解耦
- 可以控制执行顺序
- 复合开闭原则和单一职责原则
经典案例:
- javax.servlet.Filter
- javax.servlet.FilterChain
责任链模式示例:
创建一个 Handler,每个 Handler 都保存着下一个 Handler 的位置,通过自定义不同的 Handler 和组装,从而实现处理流程的自由定制
public class ChainOfResponsibility {public static void main(String[] args) {Request request = new Request(true, true, true, true, "请求");// 创建一个责任链FrequencyHandler handler = new FrequencyHandler(new LoginHandler());// 使用责任链处理请求if(handler.process(request)){System.out.println("请求成功!");} else {System.out.println("请求被拦截!");}}@Data@NoArgsConstructor@AllArgsConstructor@Accessors(chain = true)public static class Request {// 是否登录private boolean login;// 访问频率private boolean frequency;// 访问权限private boolean permission;// 敏感字private boolean containSensitiveWords;// 请求体private String requestBody;}// 责任链模式的处理器abstract static class Handler {// 指向下一个处理器Handler next;public Handler() {this(null);}// 传入下一个处理器public Handler(Handler next) {this.next = next;}public Handler getNext() {return next;}public void setNext(Handler next) {this.next = next;}abstract boolean process(Request request);}static class LoginHandler extends Handler {public LoginHandler() {super();}public LoginHandler(Handler handler) {super(handler);}@Overrideboolean process(Request request) {System.out.println("进入登录验证!");// 用户已登录if (request.isLogin()) {Handler next = getNext();// 不存在下一个处理结点if (null == next) {return true;} else return next.process(request); //进入下一个处理单元}// 用户未登录System.out.println("用户未登录,拒绝请求!");return false;}}static class FrequencyHandler extends Handler {public FrequencyHandler() {super();}public FrequencyHandler(Handler next) {super(next);}@Overrideboolean process(Request request) {System.out.println("进入频率控制模块!");// 用户请求频率合乎要求if (request.isFrequency()) {Handler next = getNext();// 不存在下一个处理结点if (null == next) {return true;} else return next.process(request); //进入下一个处理单元}System.out.println("用户请求过快,请稍后再试!");return false;}}static class PermissionHandler extends Handler {public PermissionHandler() {super();}public PermissionHandler(Handler next) {super(next);}@Overrideboolean process(Request request) {System.out.println("请入权限验证阶段!");if (request.isPermission()) {System.out.println("权限验证通过,允许访问!");Handler next = getNext();if (null == next) {return true;} else return next.process(request);}System.out.println("权限验证失败!");return false;}}static class containSensitiveWords extends Handler {public containSensitiveWords() {super();}public containSensitiveWords(Handler next) {super(next);}@Overrideboolean process(Request request) {System.out.println("进入敏感词验证模块");if (request.isContainSensitiveWords()) {System.out.println("包含敏感词,拒绝访问!");return false;} else {Handler next = getNext();if (null == next) {return true;}return next.process(request);}}}}
Filter 类型的责任链模式: ```java public class Main { interface Node {
void display(String in, String out, Chain chain);
}
static class Chain {
List<Node> chain = new ArrayList<>();int pos = 0;public void doFilter(String in, String out) {if (pos < chain.size()) {chain.get(pos++).display(in, out, this);}}public void add(Node node) {chain.add(node);}
}
public static void main(String[] args) {Chain chain = new Chain();chain.add((s1, s2, c) -> {s1 += "节点1处理" + "-->";s2 += "节点1处理" + "-->";c.doFilter(s1, s2);});chain.add((s1, s2, c) -> {s1 += "节点2处理" + "-->";s2 += "节点2处理" + "-->";c.doFilter(s1, s2);});chain.doFilter("null", "null");}
} ```
