职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形成一条对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。
职责链模式
1 概述
生活中这种情况其实很常见,公司部门之中,政府部门之中都有体现,在公司部门中,当你提交一份请求文件给你的直接上级时,你的直接上级可以处理这个文件,若他觉得自己不够资格,会将文件传递为他的直接上级,这样文件请求在这条链中传递,直到被某位感觉自己足够资格处理文件的人给处理掉为止,在政府部门也是如此。
职责链模式需要一个总接口,用来定义处理对象的公共部分(一般使用抽象类来定义),公共部分包括:一个后继处理器,设置和获取后继处理器的方法,具体的请求处理方法(这个方法需要在每个具体处理对象中实现),这里定义为抽象方法。
2 示例
我们就以公司部门为例来进行实例:
领导抽象类:Lingdao (Handler)
1 2 3 4 5 6 7 8 9 10
| public abstract class Lingdao { private Lingdao nextLingdao; public Lingdao getNextLingdao() { return nextLingdao; } public void setNextLingdao(Lingdao nextLingdao) { this.nextLingdao = nextLingdao; } abstract void chuli(Files file); }
|
领导实现类:Zongjingli、Fujingli、Bumenjingli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
public class Zongjingli extends Lingdao { private final String name = "总经理"; private final int level = 0; @Override public void chuli(Files file) { if(this.level > file.getLevel()){ System.out.println(name + "未处理文件《" + file.getFileName() + "》"); getNextLingdao().chuli(file); }else{ System.out.println(name + "处理了文件《" + file.getFileName() + "》"); } } }
public class Fujingli extends Lingdao { private final String name = "副经理"; private final int level = 1; @Override public void chuli(Files file) { if(this.level > file.getLevel()){ System.out.println(name + "未处理文件《" + file.getFileName() + "》"); getNextLingdao().chuli(file); }else{ System.out.println(name + "处理了文件《" + file.getFileName() + "》"); } } }
public class Bumenjingli extends Lingdao{ private final String name = "部门经理"; private final int level = 2; @Override public void chuli(Files file) { if(this.level > file.getLevel()){ System.out.println(name + "未处理文件《" + file.getFileName() + "》"); getNextLingdao().chuli(file); }else{ System.out.println(name + "处理了文件《" + file.getFileName() + "》"); } } }
|
文件类:Files
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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; } }
|
测试类:Clienter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Clienter { public static void main(String[] args) { Lingdao zongjingli = new Zongjingli(); Lingdao fujingli = new Fujingli(); Lingdao bumenjingli = new Bumenjingli(); bumenjingli.setNextLingdao(fujingli); fujingli.setNextLingdao(zongjingli); Files f1 = new Files(); f1.setFileName("正确对待旱鸭子"); f1.setLevel(1); Files f2 = new Files(); f2.setFileName("年会在那里举行"); f2.setLevel(0); bumenjingli.chuli(f1); bumenjingli.chuli(f2); } }
|
参考链接
参考链接