设计模式-责任链模式(Chain of Responsibility)

概述

  • 定义 : 又名职责链模式, 为请求创建一个接收此次请求对象的链
  • 类型 : 行为型

适用场景

  • 一个请求的处理需要多个对象当中的一个或几个协作处理

优点

  • 请求的发送者和接收者(请求的处理)解耦
  • 责任链可以动态组合

缺点

  • 责任链太长或者处理时间过长的话, 会影响性能
  • 责任链有可能过多

模式角色

  • Handler :

    • 定义一个处理请求的接口。
    • (可选)实现后继链。
  • ConcreteHandler :

    • 处理它所负责的请求。
    • 可访问它的后继者。
    • 如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
  • Client : 向链上的具体处理者(ConcreteHandler )对象提交请求。

代码实现

场景

以注册时校验用户名密码为例, 类与设计模式中个角色对应关系如下:

  • Handler接口 : 对应Handler角色
  • NameCheckHandler, PwdCheckHandler : 对应ConcreteHandler角色
  • Client : 对应Client角色

UML类图

设计模式-责任链模式(Chain of Responsibility)_第1张图片

代码

Handler接口 :

/**
 * @author 七夜雪
 * @create 2018-11-24 19:24
 */
public interface Handler {

    public void check(User user);

    public void setNextHandler(Handler handler);

}

NameCheckHandler, PwdCheckHandler :

/**
 * 用户名校验
 *
 * @author 七夜雪
 * @create 2018-11-24 19:24
 */
public class NameCheckHandler implements Handler {

    private Handler handler;

    @Override
    public void check(User user) {
        if (null == user.getName() || "".equals(user.getName())){
            System.out.println("用户名为空 : 流程结束");
        } else {
            System.out.println("用户名不为空 : 正确");
            if (null != handler) {
                handler.check(user);
            } else {
                System.out.println("校验完毕 : 流程结束");
            }
        }
    }

    @Override
    public void setNextHandler(Handler handler) {
        this.handler = handler;
    }
}
/**
 * 密码校验类
 *
 * @author 七夜雪
 * @create 2018-11-24 19:29
 */
public class PwdCheckHandler implements Handler {
    private Handler handler;

    @Override
    public void check(User user) {
        if (null == user.getPwd() || "".equals(user.getPwd())){
            System.out.println("密码为空 : 流程结束");
        } else {
            System.out.println("密码不为空 : 正确");
            if (null != handler) {
                handler.check(user);
            } else {
                System.out.println("校验完毕 : 流程结束");
            }
        }
    }

    @Override
    public void setNextHandler(Handler handler) {
        this.handler = handler;
    }
}

Client :

    public static void main(String[] args) {
        User user = new User("七夜雪", "123456");
        Handler handler1 = new NameCheckHandler();
        Handler handler2 = new PwdCheckHandler();
        handler1.setNextHandler(handler2);
        handler1.check(user);
        user.setName(null);
        System.out.println("---------分隔符----------");
        handler1.check(user);
    }

测试结果 :

用户名不为空 : 正确
密码不为空 : 正确
校验完毕 : 流程结束
---------分隔符----------
用户名为空 : 流程结束

本文参考:
慕课网课程
四人帮<设计模式>

你可能感兴趣的:(设计模式,设计模式)