一、模式简介
定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
场景:有多个对象可以处理一个请求,哪个对象处理该请求由运行时刻自动确定。可动态指定一组对象处理请求,或添加新的处理者。在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。
- 角色结构:
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- 客户端(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
二、模式实现
public abstract class AbstractHandler { -> 抽象处理者
private AbstractHandler next;
public AbstractHandler getNext() {
return next;
}
public void setNext(AbstractHandler next) {
if(this.next != null){
next.next = this.next;
}
this.next = next;
}
public abstract void handle(String department);
}
public class AdminConcreteHandler extends AbstractHandler { -> 具体处理者
@Override
public void handle(String department) {
System.out.println("请求经过行政部");
if ("admin".equals(department)) {
System.out.println("行政部处理请求");
} else {
if (getNext() != null) {
getNext().handle(department);
}
}
}
}
public class SaleConcreteHandler extends AbstractHandler { -> 具体处理者
@Override
public void handle(String department) {
System.out.println("请求经过销售部");
if ("sale".equals(department)) {
System.out.println("销售部处理请求");
} else {
if (getNext() != null) {
getNext().handle(department);
}
}
}
}
public class TechnicalConcreteHandler extends AbstractHandler {
@Override
public void handle(String department) {
System.out.println("请求经过技术部");
if ("technical".equals(department)) {
System.out.println("技术部处理请求");
} else {
if (getNext() != null) {
getNext().handle(department);
}
}
}
}
以寻求公司的某个部门协助为例子,各个部门串联形成责任链,符合条件则截获请求并完成,否则流向下一个部门,执行相同的步骤,直至符合条件为止。
AbstractHandler technical = new TechnicalConcreteHandler();
AbstractHandler sale = new SaleConcreteHandler();
AbstractHandler admin = new AdminConcreteHandler(); -> 客户端
admin.setNext(technical);
admin.setNext(sale);
admin.handle("technical");
网友评论