责任链模式:将请求的处理对象用一条长链组合起来,形成对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。
在公司部门中,当你提交一份请求文件给你的直接上级,你的上级会将文件传递为他的直接上级,这样文件请求在这条链中传递,直到有人处理为止。
责任链需要一个总接口,用来定义处理对象的公共部分(一般使用抽象类定义),公共部分包括:一个后继处理器,设置和获取后继处理器的方法,具体的请求处理方法(这个方法需要在每个具体处理对象中实现),这里定义为抽象方法。
形成链:
1. 需要在处理者对象中定义后继处理者对象,将这部分代码抽象到抽象类中实现,降低了代码重复性。
2. 在处理者对象类中的处理方法中如果当前处理者对象无法处理,就将其传递到后继对象中。
3. 在测试类中将这些处理者类的实例串联成串。
特点:
虽然实现请求额度传递,但是如果一旦不存在请求处理的类,那么这个请求一直存在链条中。
如果设计成环形,这个请求将永远在环链中传递。
由于请求的传递,处理效率会降低。
/*** 领导抽象类*/public abstract class LingDao {private LingDao nextLingDao;public LingDao getNextLingDao() {return nextLingDao;}public void setNextLingDao(LingDao nextLingDao) {this.nextLingDao = nextLingDao;}abstract void chuLi(Files files);}
/*** 文件*/public class Files {private String fileName;private int level;public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}}
/*** 总经理*/public class Zongjingli extends LingDao {private final String name = "总经理";private final int level = 0;@Overridevoid chuLi(Files files) {if (this.level > files.getLevel()) {System.out.println(name + "未处理文件");getNextLingDao().chuLi(files);} else {System.out.println(name + "处理了文件");}}}
/*** 副总*/public class Fujingli extends LingDao {private final String name = "副总";private final int level = 0;@Overridevoid chuLi(Files files) {if (level == files.getLevel()) {System.out.println(name + "未处理文件");getNextLingDao().chuLi(files);} else {System.out.println(name + "处理了文件");}}}
/*** 主管*/public class ZhuGuan extends LingDao {private final String name = "主管";private final int level = 0;@Overridevoid chuLi(Files files) {if (level == files.getLevel()) {System.out.println(name + "未处理文件");getNextLingDao().chuLi(files);} else {System.out.println(name + "处理了文件");}}}
public class Clienter {public static void main(String[] args) {LingDao zongJingLi = new Zongjingli();LingDao fuJingLi = new Fujingli();LingDao zhuGuan = new ZhuGuan();zhuGuan.setNextLingDao(fuJingLi);fuJingLi.setNextLingDao(zongJingLi);//定义两份文件Files f1 = new Files();f1.setFileName("正确对待旱鸭子");f1.setLevel(1);Files f2 = new Files();f2.setFileName("年会举办");f2.setLevel(0);//提交文件zhuGuan.chuLi(f1);zhuGuan.chuLi(f2);//主管处理了文件//主管未处理文件//副总未处理文件//总经理处理了文件}}
