责任链模式

责任链模式

概念:

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

使用场景
  • hr筛选简历 -> 技术主管 -> 技术总监二面 -> 人资总监面试
  • 每一环节的结果都是是可传递性的,也就是如果面试通过,就会到下一轮面试,成为一条传递链
Created with Raphaël 2.2.0 hr筛选简历,约面试 笔试 技术主管一面 技术总监二面 人资总监面试 面试通过发offer 面试不通过结束 yes no yes no yes no yes no
代码演示
抽象出来面试官类
/**
 * 抽象出来面试官类
 */
interface Interviewer {
    /**
     * 面试
     *
     * @return 返回面试结果
     */
    boolean interview(Applicant applicant, Result result);
}
面试环节实现类
/**
 * 笔试面试环节
 */
@Data
class InterviewiWritten implements Interviewer {
    @Override
    public boolean interview(Applicant applicant, Result result) {
        System.out.println(applicant.getName() + "同学,进入笔试面试环节,应聘的岗位为:" + applicant.getJob());

        result.setResult(result.getResult() + "笔试面试通过");
        System.out.println(result.getResult());
        result.setFlag(true);

        return result.isFlag();
    }
}

/**
 * 技术首面
 */
class InterviewerLeader implements Interviewer {
    @Override
    public boolean interview(Applicant applicant, Result result) {
        System.out.println(applicant.getName() + "同学,进入首轮技术面试环节,应聘的岗位为:" + applicant.getJob());

        result.setResult(result.getResult() + "-->技术首面通过");
        System.out.println(result.getResult());
        result.setFlag(true);

        return result.isFlag();
    }
}

/**
 * 技术经理二面
 */
class IntervewerManager implements Interviewer {

    @Override
    public boolean interview(Applicant applicant, Result result) {
        System.out.println(applicant.getName() + "同学,进入二轮技术面试环节,应聘的岗位为:" + applicant.getJob());

        result.setResult(result.getResult() + "-->技术二轮面试通过");
        System.out.println(result.getResult());
        result.setFlag(true);

        return result.isFlag();
    }
}

/**
 * 人资终面
 */
class IntervewerHr implements Interviewer {

    @Override
    public boolean interview(Applicant applicant, Result result) {
        System.out.println(applicant.getName() + "同学,进入人资面试环节,应聘的岗位为:" + applicant.getJob());

        result.setResult(result.getResult() + "-->人资终面通过");
        System.out.println(result.getResult());
        result.setFlag(true);

        return result.isFlag();
    }
}
面试环节链
/**
 * 面试流程链条
 */
@NoArgsConstructor
@AllArgsConstructor
class InterviewChain implements Interviewer {
    List<Interviewer> chains = new CopyOnWriteArrayList<>();

    /**
     * @param interviewer
     * @return this 可以采用链式编程
     */
    InterviewChain add(Interviewer interviewer) {
        chains.add(interviewer);

        return this;
    }

    /**
     * 面试流程链同样实现面试流程接口
     *
     * @param applicant
     * @param result
     * @return
     */
    @Override
    public boolean interview(Applicant applicant, Result result) {
        for (Interviewer interviewer : chains) {
            if (!interviewer.interview(applicant, result)) {
                result.setFlag(false);

                return result.isFlag();
            }
        }
        return true;
    }
}
定义应聘者和面试结果
/**
 * 应聘者
 */
@Data
@AllArgsConstructor
class Applicant {
    // 姓名
    protected String name;

    // 年龄
    protected int age;

    // 应聘岗位
    protected String job;
}

/**
 * 面试结果
 */
@Data
class Result {
    // 面试结果
    protected String result = "";

    // 是否通过
    protected boolean flag;
}
面试环节
/**
 * 责任链模式
 *
 * @author liouwb
 */
public class ChainPatternTest {
    public static void main(String[] args) {
        // 面试者
        Applicant applicant = new Applicant("liouwb", 28, "java");
        // 面试结果
        Result result = new Result();
        result.setFlag(true);

        // 面试流程链 添加面试流程 可以自定义调整
        InterviewChain interviewChain = new InterviewChain();
        interviewChain.add(new InterviewiWritten())
                .add(new InterviewerLeader())
                .add(new IntervewerManager())
                .add(new IntervewerHr());
        // 面试
        interviewChain.interview(applicant, result);
    }

}
执行结果:
liouwb同学,进入笔试面试环节,应聘的岗位为:java
笔试面试通过
liouwb同学,进入首轮技术面试环节,应聘的岗位为:java
笔试面试通过-->技术首面通过
liouwb同学,进入二轮技术面试环节,应聘的岗位为:java
笔试面试通过-->技术首面通过-->技术二轮面试通过
liouwb同学,进入人资面试环节,应聘的岗位为:java
笔试面试通过-->技术首面通过-->技术二轮面试通过-->人资终面通过
优点:
  • 降低请求发送者和接收者之间的耦合度
  • 增加了对象指派职责的灵活度、增强了可扩展性
  • 将多个条件语句进行分散到各个具体处理类中,增加代码的可阅读性。使代码更加清晰,责任更明确
代码地址:

https://gitee.com/liouwb/design-mode/blob/master/src/ChainPatternTest.java

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值