【设计模式】责任链模式
一、责任链定义
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
大概就是一个请求,先经过A处理器,如果A能处理,那A就处理,如果A不能处理,就给事先设定好的B处理器处理。以此类推。由此形成一条责任链
二、责任链的用途
主要是解耦处理者。传统的方法处理请求就是将请求和处理耦合在一起。
handler{
if(check(A)){
A.doSomething();
}else if(check(B)){
B.doSomething();
}
}
这样的缺点就是耦合太高,如果有新处理者会修改原代码。还会有太多的if-else
三、责任链的简单实现
1.这里我们将handler抽象出来,要求处理请求处理者都要实现处理请求的方法,并且需要指明自己如果不能处理请求,将会给谁处理(这里我们以学生请假天数举例,班主任 -> 年纪主任 -> 院长 )
①领导抽象类
abstract class Leader {
private Leader next;
public void setNext(Leader next){
this.next = next;
}
public Leader getNext(){
return next;
}
abstract void handleRequest(int dayCnt);
}
②三个处理者
class banzhuren extends Leader{
@Override
void handleRequest(int dayCnt) {
if(dayCnt <= 3){
System.out.println("班主任准了你" + dayCnt + "天假");
}else if(getNext() != null){
getNext().handleRequest(dayCnt);
}
}
}
class zhuren extends Leader{
@Override
void handleRequest(int dayCnt) {
if(dayCnt <= 7){
System.out.println("年级主任准了你" + dayCnt + "天假");
}else if(getNext() != null){
getNext().handleRequest(dayCnt);
}
}
}
class yuanzhang extends Leader{
@Override
void handleRequest(int dayCnt) {
if(dayCnt <= 15){
System.out.println("院长准了你" + dayCnt + "天假");
}else if(getNext() != null){
getNext().handleRequest(dayCnt);
}else{
System.out.println("退学 re 吧");
}
}
}
③Main函数设置责任链
public static void main(String[] args) {
Leader zhuren = new zhuren();
Leader yuanzhang = new yuanzhang();
Leader banzhuren = new banzhuren();
zhuren.setNext(yuanzhang);
banzhuren.setNext(zhuren);
banzhuren.handleRequest(18);
}
四、应用举例
servlet 中的 Fliter。
spring MVC 中Handler的实现。
...