责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。
责任链模式由两个角色组成:
1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
public abstract class Handler{
protected Handler successor;
protected String name;
public String getName(){
return name;
}
//处理请求,由子类完成
public abstract void handleRequest(String request);
//设置下一个处理请求的人
public void setNextHandle(Handler successor){
this.successor = successor;
}
}
public LaoShi extends Handler{
public LaoShi(String name){
this.name = name;
}
public void handleRequest(String request){
if("请假不去上课".equals(request)){
System.out.println(name+"可以处理"+request+",给与批准");
}else{
System.out.println(name+"不可以处理"+request+"转交给"+successor.getName());
successor.handleRequest(request);
}
}
}
public class BanZhang extends Handler {
public BanZhang(String name) {
this.name = name;
}
public void handleRequest(String request) {
if ("不去开班会".equals(request)) {
System.out.println(name + "可以处理" + request + ",给予批准!");
} else {
System.out.println(name + "不可以处理" + request + "转交给"
+ successor.getName());
successor.handleRequest(request);
}
}
}
- public class DaoYuan extends Handler {
- public DaoYuan(String name) {
- this.name = name;
- }
- public void handleRequest(String request) {
- if ("离校".equals(request)) {
- System.out.println(name + "可以处理" + request + "给于批准!");
- } else {
- System.out.println(name + "不可以处理" + request + "转交给"
- + successor.getName());
- successor.handleRequest(request);
- }
- }
- }
- public class XiaoZhang extends Handler {
- public XiaoZhang(String name) {
- this.name = name;
- }
- public void handleRequest(String request) {
- if ("退学".equals(request)) {
- System.out.println(name + "可以处理" + request + "给于批准!");
- } else {
- System.out.println(name + "觉的" + request + "是无理请求,不给于批准");
- }
- }
- }
- public class XueYuanWithPattern {
- private String name;
- public XueYuanWithPattern(String name) {
- this.name = name;
- }
- public static void main(String[] args) {
- Handler banzhang = new BanZhang("班长");
- Handler laoshi = new BanZhang("老师");
- Handler daoyuan = new DaoYuan("导员");
- Handler xiaozhang = new XiaoZhang("校长");
- banzhang.setNextHandler(laoshi); // 设置班长的下一个处理者是老师
- laoshi.setNextHandler(daoyuan);// 设置老师的下一个处理者是导员
- daoyuan.setNextHandler(xiaozhang);// 设置导员的下一个处理者是校长
- String requests = "退学";
- // 把请求交给班长即可,如果班长处理不了会一层层往上交
- banzhang.handleRequest(requests);
- }
- }
责任链模式优点,上面已经体现出来了。无非就是降低了耦合、提高了灵活性。但是责任链模式可能会带来一些额外的性能损耗,因为它要从链子开头开始遍历。
因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。
缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR
扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里。