责任链模式
程序员文章站
2022-04-17 18:45:27
...
Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
至于类图不放也罢。毕竟就是一个继承或者实现。
纯与不纯
责任链模式的纯与不纯的区别,就像黑猫、白猫的区别一样。不要刻意的去使自己的代码来符合一个模式的公式。只要能够使代码降低耦合、提高重用,满足系统需求并能很好的适应变化就好了。正所谓:管它黑猫白猫,抓住老鼠就是好猫!
纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。
反之,则就是不纯的责任链模式。
不纯的责任链模式还算是责任链模式吗?比如一个请求被捕获后,每个具体处理者都尝试去处理它,不管结果如何都将请求再次转发。我认为这种方式的实现,算不算是责任链模式的一种倒不重要,重要的是我们也能从中体味到责任链模式的思想:通过将多个处理者之间建立联系,来达到请求与具体的某个处理者的解耦。
[img]http://www.yesky.com/SoftChannel/72342371961929728/20020415/jt-2002-4-15-chainofresp.gif[/img]
我在代码中写了一个Army的Handler类,其中实现它的有陆军军士长,陆军上尉,陆军上校和将军,军士长可以对士兵的请假做审核处理,上尉可以对士兵的破坏请求做处理,上校可以对士兵的谍报请求做处理,而将军可以对士兵的开战请求做处理。
handler:
Test:
1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
至于类图不放也罢。毕竟就是一个继承或者实现。
纯与不纯
责任链模式的纯与不纯的区别,就像黑猫、白猫的区别一样。不要刻意的去使自己的代码来符合一个模式的公式。只要能够使代码降低耦合、提高重用,满足系统需求并能很好的适应变化就好了。正所谓:管它黑猫白猫,抓住老鼠就是好猫!
纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。
反之,则就是不纯的责任链模式。
不纯的责任链模式还算是责任链模式吗?比如一个请求被捕获后,每个具体处理者都尝试去处理它,不管结果如何都将请求再次转发。我认为这种方式的实现,算不算是责任链模式的一种倒不重要,重要的是我们也能从中体味到责任链模式的思想:通过将多个处理者之间建立联系,来达到请求与具体的某个处理者的解耦。
[img]http://www.yesky.com/SoftChannel/72342371961929728/20020415/jt-2002-4-15-chainofresp.gif[/img]
我在代码中写了一个Army的Handler类,其中实现它的有陆军军士长,陆军上尉,陆军上校和将军,军士长可以对士兵的请假做审核处理,上尉可以对士兵的破坏请求做处理,上校可以对士兵的谍报请求做处理,而将军可以对士兵的开战请求做处理。
handler:
package pattern.chain;
public abstract class Army {
protected Army army;
public Army(Army army) {
this.army = army;
}
Status s;
public enum Status {
JIA("请假"), PO("破坏"), DIE("谍报"), KAI("开战");
String value = "";
private Status(String value) {
this.value = value;
}
String getValue() {
return this.value;
}
}
public void setNext(Army army) {
this.army = army;
}
protected abstract void handler(Status s);
public void next() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (army != null) {
army.handler(s);
}
}
}
package pattern.chain;
public class General extends Army {
public General(Army army) {
super(army);
// TODO Auto-generated constructor stub
}
@Override
protected void handler(Status s) {
this.s = s;
if (Status.KAI.equals(s)) {
System.out.println("将军同意");
} else {
next();
}
}
}
package pattern.chain;
public class Colonel extends Army {
public Colonel(Army army) {
super(army);
// TODO Auto-generated constructor stub
}
@Override
protected void handler(Status ss) {
this.s=ss;
if (Status.DIE.equals(s)) {
System.out.println("少校同意");
} else {
next(); }
}
}
package pattern.chain;
public class Captain extends Army {
public Captain(Army army) {
super(army);
// TODO Auto-generated constructor stub
}
@Override
protected void handler(Status ss) {
this.s = ss;
if (Status.PO.equals(s)) {
System.out.println("上尉同意");
} else {
next();
}
}
}
package pattern.chain;
public class Commander extends Army {
public Commander(Army army) {
super(army);
// TODO Auto-generated constructor stub
}
@Override
protected void handler(Status ss) {
this.s = ss;
if (Status.JIA.equals(s)) {
System.out.println("士官长同意");
} else {
next();
}
}
}
Test:
package pattern.chain;
import pattern.chain.Army.Status;
public class Test {
public static void main(String[] args) {
Army gen = new General(null);
Army col = new Colonel(gen);
Army cap = new Captain(col);
Army com = new Commander(cap);
com.setNext(cap);
cap.setNext(col);
col.setNext(gen);
com.handler(Status.KAI);
}
}
上一篇: github 提交代码
下一篇: git提交代码至码云