定义:
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链重点在于链上,由一条链处理相似请求,在链中决定谁来处理这个请求,并返回相应的结果。
角色:
- 抽象处理者角色:该角色对请求进行抽象,定义一个方法以设定和返回对下一个处理者的引用
- 具体处理者角色:该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者,由于具体处理者持有对下一个处理者的引用,因此如果需要,具体处理者可以访问下一个处理者
优点:
- 将请求和处理分开,请求者不知道是谁处理的,处理者可以不用知道请求的全貌
- 提高系统灵活性
缺点:
- 降低程序性能
- 不易于调试
- 结点需要控制,避免出现超长链情况
场景:
- 一个业务需要一系列的处理工作
- 业务流的处理,例如文件审批
- 对系统进行补充扩展
实例:击鼓传花
抽象处理角色定义规则,定义下一个,定义共同方法
package 责任链模式;
public abstract class Player {
private Player people;
public abstract void handle(int i);
protected void setpeople(Player peo){
this.people = peo;
}
public void next(int i){
if(people !=null){
people.handle(i);
}else{
System.out.println("游戏结束");
}
}
}
package 责任链模式;
public class P1 extends Player{
public P1(Player p){
this.setpeople(p);
}
@Override
public void handle(int i) {
// TODO 自动生成的方法存根
if(i==1){
System.out.println("p1喝酒");
}else{
System.out.println("p1传花");
this.next(i);
}
}
}
package 责任链模式;
public class P2 extends Player{
public P2(Player p){
this.setpeople(p);
}
@Override
public void handle(int i) {
// TODO 自动生成的方法存根
if(i==2){
System.out.println("P2喝酒");
}else{
System.out.println("P2传花");
this.next(i);
}
}
}
P3。。。。
package 责任链模式;
public class Main {
public static void main(String []args) {
Player player = new P1(new P2(new P3(new P4(new P5(null)))));
player.handle(4);
}
}
p1传花
P2传花
P3传花
P4喝酒