责任链模式(Chain of Responsibility Pattern)和中介者模式(Mediator Pattern)是两种行为型设计模式,它们分别处理不同的职责和协作方式。将这两种模式结合使用,可以更好地解耦系统中的组件,特别是在需要处理多个对象之间复杂交互的场景中。让我们看看这两种模式的特点以及如何结合使用。
责任链模式(Chain of Responsibility Pattern)旨在将请求的处理从发送者解耦,允许多个处理对象形成一个链条,每个处理对象决定是否处理请求。如果某个对象不能处理该请求,它会将请求传递给链条中的下一个对象,直到请求被处理或链条末尾。
中介者模式(Mediator Pattern)则是通过引入一个中介者对象来协调和管理多个对象的交互,从而避免它们之间直接的相互依赖。中介者通过集中控制各个组件的交互来降低系统的耦合度。
将这两种模式结合使用时,责任链模式用于处理请求的传递,而中介者模式则管理这些请求的处理过程,并协调多个处理者之间的合作。
假设我们有一个客服请求处理系统,其中包含多个不同级别的客服人员(如初级客服、高级客服、经理等)。每个客服人员能够处理不同类型的请求,但如果某个客服无法处理请求,他会将请求传递给下一位更高级别的客服。而且,所有的请求处理都通过一个中介者进行管理和协调,以确保请求的流转和处理的顺序。
首先,我们定义一个请求对象,表示需要处理的客户请求。
// 客户请求
public class CustomerRequest {
private String requestDescription;
public CustomerRequest(String requestDescription) {
this.requestDescription = requestDescription;
}
public String getRequestDescription() {
return requestDescription;
}
}
接着,我们定义一个处理者接口,每个客服都可以根据自己的能力来处理请求。如果无法处理请求,它会将请求转交给链条中的下一个客服。
// 处理者接口
public interface RequestHandler {
void setNextHandler(RequestHandler nextHandler); // 设置下一个处理者
void handleRequest(CustomerRequest request); // 处理请求
}
我们定义几个具体的处理者:初级客服、高级客服和经理。每个处理者都能处理不同类型的请求,并将无法处理的请求传递给下一个处理者。
// 初级客服
public class JuniorSupport implements RequestHandler {
private RequestHandler nextHandler;
@Override
public void setNextHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(CustomerRequest request) {
if (request.getRequestDescription().equals("Basic Inquiry")) {
System.out.println("Junior Support handling: " + request.getRequestDescription());
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 高级客服
public class SeniorSupport implements RequestHandler {
private RequestHandler nextHandler;
@Override
public void setNextHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(CustomerRequest request) {
if (request.getRequestDescription().equals("Technical Issue")) {
System.out.println("Senior Support handling: " + request.getRequestDescription());
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 经理
public class Manager implements RequestHandler {
private RequestHandler nextHandler;
@Override
public void setNextHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(CustomerRequest request) {
if (request.getRequestDescription().equals("Complaint")) {
System.out.println("Manager handling: " + request.getRequestDescription());
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
然后,我们定义一个中介者接口,该接口负责协调各个处理者的工作,接收并管理请求的流转。中介者的作用是简化各个处理者之间的交互,使得处理者之间不需要直接依赖。
// 中介者接口
public interface SupportMediator {
void registerHandler(RequestHandler handler); // 注册处理者
void handleRequest(CustomerRequest request); // 处理请求
}
接着,我们实现一个具体的中介者,它管理多个处理者,并控制请求的流转。
// 客服请求管理器
public class SupportRequestManager implements SupportMediator {
private List<RequestHandler> handlers = new ArrayList<>();
@Override
public void registerHandler(RequestHandler handler) {
handlers.add(handler);
}
@Override
public void handleRequest(CustomerRequest request) {
for (RequestHandler handler : handlers) {
handler.handleRequest(request);
}
}
}
在客户端,我们创建中介者(客服请求管理器)和各个处理者,并注册它们。当收到请求时,客户端通过中介者来处理请求。
public class Client {
public static void main(String[] args) {
// 创建各个客服处理者
RequestHandler juniorSupport = new JuniorSupport();
RequestHandler seniorSupport = new SeniorSupport();
RequestHandler manager = new Manager();
// 创建中介者
SupportMediator mediator = new SupportRequestManager();
// 注册处理者
mediator.registerHandler(juniorSupport);
mediator.registerHandler(seniorSupport);
mediator.registerHandler(manager);
// 创建客服请求
CustomerRequest basicInquiry = new CustomerRequest("Basic Inquiry");
CustomerRequest technicalIssue = new CustomerRequest("Technical Issue");
CustomerRequest complaint = new CustomerRequest("Complaint");
// 通过中介者处理请求
System.out.println("Processing Basic Inquiry:");
mediator.handleRequest(basicInquiry); // 只有初级客服会处理
System.out.println("\nProcessing Technical Issue:");
mediator.handleRequest(technicalIssue); // 高级客服会处理
System.out.println("\nProcessing Complaint:");
mediator.handleRequest(complaint); // 经理会处理
}
}
Processing Basic Inquiry:
Junior Support handling: Basic Inquiry
Processing Technical Issue:
Senior Support handling: Technical Issue
Processing Complaint:
Manager handling: Complaint
将责任链模式和中介者模式结合使用,能够带来以下好处:
将责任链模式和中介者模式结合使用,可以使得请求的处理更加灵活和可扩展。责任链模式负责请求的传递和处理,而中介者模式则集中管理请求的流转和各个组件的交互。通过这种组合模式,可以有效地解耦系统中的各个组件,提高系统的可维护性、灵活性和扩展性。