使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。
public interface IHandler {
boolean handle();
}
public class HandlerA implements IHandler {
@Override
public boolean handle() {
boolean handled = false;
System.out.println("HandlerA handle()");
return handled;
}
}
public class HandlerB implements IHandler {
@Override
public boolean handle() {
boolean handled = false;
System.out.println("HandlerB handle()");
return handled;
}
}
public class HandlerChain {
private final List<IHandler> handlers = new ArrayList<>();
public void addHandler(IHandler handler) {
this.handlers.add(handler);
}
public void handle() {
for (IHandler handler : handlers) {
boolean handled = handler.handle();
if (handled) {
break;
}
}
}
}
public abstract class Handler {
protected Handler nextHandler = null;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final void handle() {
boolean handled = doHandle();
if (nextHandler != null && !handled) {
nextHandler.handle();
}
}
protected abstract boolean doHandle();
}
public class HandlerA extends Handler {
@Override
protected boolean doHandle() {
boolean handled = false;
System.out.println("HandlerA doHandle()");
return handled;
}
}
public class HandlerB extends Handler {
@Override
protected boolean doHandle() {
boolean handled = false;
System.out.println("HandlerB doHandle()");
return handled;
}
}
public class HandlerChain {
private Handler head = null;
private Handler tail = null;
public void addHandler(Handler handler) {
handler.setNextHandler(null);
if (head == null) {
head = handler;
tail = handler;
return;
}
tail.setNextHandler(handler);
tail = handler;
}
public void handle() {
if (head != null) {
head.handle();
}
}
}
public class Client {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.handle();
}
}
适配器模式在Spring框架中有多个应用场景,其中一些主要体现在以下方面:
HandlerAdapter
接口和其实现类用于适配不同类型的处理器(Controller)。不同的Controller可能有不同的接口,而HandlerAdapter
负责将它们适配到Spring MVC框架中,以便它们能够正确处理请求。不同的HandlerAdapter
实现适配不同类型的Controller,如SimpleControllerHandlerAdapter
、HttpRequestHandlerAdapter
等。MessageListenerAdapter
用于将普通的Java对象转换为消息监听器。通过适配器模式,可以将接收到的消息传递给目标对象的特定方法进行处理。JdbcTemplate
和 NamedParameterJdbcTemplate
等类使用了适配器模式,将JDBC的底层操作适配到Spring的数据访问框架中,使得开发者可以更方便地使用JDBC进行数据库操作。AdvisorAdapter
接口定义了如何适配不同类型的通知(Advice)。Spring通过适配器模式将不同类型的通知适配到切面(Aspect)中,从而实现对不同通知的灵活支持。HandlerInterceptor
接口定义了拦截器的方法。不同的拦截器可能只实现了其中的某些方法,而适配器模式用于适配这些拦截器,使得它们只需要实现自己关心的方法。总体而言,Spring框架中广泛使用适配器模式来处理不同接口之间的适配问题,使得不同的组件、框架或者接口能够协同工作,提供更灵活、可扩展的组件集成。适配器模式有助于降低组件之间的耦合度,同时提高了系统的可维护性和可扩展性。