责任链模式:将请求的处理对象用一条长链组合起来,形成对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。
    在公司部门中,当你提交一份请求文件给你的直接上级,你的上级会将文件传递为他的直接上级,这样文件请求在这条链中传递,直到有人处理为止。
    责任链需要一个总接口,用来定义处理对象的公共部分(一般使用抽象类定义),公共部分包括:一个后继处理器,设置和获取后继处理器的方法,具体的请求处理方法(这个方法需要在每个具体处理对象中实现),这里定义为抽象方法。
    形成链:
    1. 需要在处理者对象中定义后继处理者对象,将这部分代码抽象到抽象类中实现,降低了代码重复性。
    2. 在处理者对象类中的处理方法中如果当前处理者对象无法处理,就将其传递到后继对象中。
    3. 在测试类中将这些处理者类的实例串联成串。
    特点:
    虽然实现请求额度传递,但是如果一旦不存在请求处理的类,那么这个请求一直存在链条中。
    如果设计成环形,这个请求将永远在环链中传递。
    由于请求的传递,处理效率会降低。

    1. /**
    2. * 领导抽象类
    3. */
    4. public abstract class LingDao {
    5. private LingDao nextLingDao;
    6. public LingDao getNextLingDao() {
    7. return nextLingDao;
    8. }
    9. public void setNextLingDao(LingDao nextLingDao) {
    10. this.nextLingDao = nextLingDao;
    11. }
    12. abstract void chuLi(Files files);
    13. }
    1. /**
    2. * 文件
    3. */
    4. public class Files {
    5. private String fileName;
    6. private int level;
    7. public String getFileName() {
    8. return fileName;
    9. }
    10. public void setFileName(String fileName) {
    11. this.fileName = fileName;
    12. }
    13. public int getLevel() {
    14. return level;
    15. }
    16. public void setLevel(int level) {
    17. this.level = level;
    18. }
    19. }
    1. /**
    2. * 总经理
    3. */
    4. public class Zongjingli extends LingDao {
    5. private final String name = "总经理";
    6. private final int level = 0;
    7. @Override
    8. void chuLi(Files files) {
    9. if (this.level > files.getLevel()) {
    10. System.out.println(name + "未处理文件");
    11. getNextLingDao().chuLi(files);
    12. } else {
    13. System.out.println(name + "处理了文件");
    14. }
    15. }
    16. }
    1. /**
    2. * 副总
    3. */
    4. public class Fujingli extends LingDao {
    5. private final String name = "副总";
    6. private final int level = 0;
    7. @Override
    8. void chuLi(Files files) {
    9. if (level == files.getLevel()) {
    10. System.out.println(name + "未处理文件");
    11. getNextLingDao().chuLi(files);
    12. } else {
    13. System.out.println(name + "处理了文件");
    14. }
    15. }
    16. }
    1. /**
    2. * 主管
    3. */
    4. public class ZhuGuan extends LingDao {
    5. private final String name = "主管";
    6. private final int level = 0;
    7. @Override
    8. void chuLi(Files files) {
    9. if (level == files.getLevel()) {
    10. System.out.println(name + "未处理文件");
    11. getNextLingDao().chuLi(files);
    12. } else {
    13. System.out.println(name + "处理了文件");
    14. }
    15. }
    16. }
    1. public class Clienter {
    2. public static void main(String[] args) {
    3. LingDao zongJingLi = new Zongjingli();
    4. LingDao fuJingLi = new Fujingli();
    5. LingDao zhuGuan = new ZhuGuan();
    6. zhuGuan.setNextLingDao(fuJingLi);
    7. fuJingLi.setNextLingDao(zongJingLi);
    8. //定义两份文件
    9. Files f1 = new Files();
    10. f1.setFileName("正确对待旱鸭子");
    11. f1.setLevel(1);
    12. Files f2 = new Files();
    13. f2.setFileName("年会举办");
    14. f2.setLevel(0);
    15. //提交文件
    16. zhuGuan.chuLi(f1);
    17. zhuGuan.chuLi(f2);
    18. //主管处理了文件
    19. //主管未处理文件
    20. //副总未处理文件
    21. //总经理处理了文件
    22. }
    23. }