适配器模式
* 核心思想:让每一种类型的对象通过一个适配器接口,获得对应的处理器,再让对应的处理器去做对应的
进而处理优化 if-else
类适配器
* 在 Spring 适配器 DispatcherServlet
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
//.....
try {
try {
//.....
// 查找合适的适配器
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
//.....
// do
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//.....
}
} finally {
//.....
}
}
}
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
// 使用迭代器查询对应的处理器
Iterator var2 = this.handlerAdapters.iterator();
while(var2.hasNext()) {
HandlerAdapter adapter = (HandlerAdapter)var2.next();
if (adapter.supports(handler)) {
// 返回对应的适配器
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
public interface HandlerAdapter { // 适配器接口
boolean supports(Object handler);
@Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}
* 在 Spring 适配器 AOP
public class ResultMsg {
private String code;
private String msg;
private Object data;
public ResultMsg(String code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
}
public interface LoginAdapter {
boolean supports(Object adapter);
String login(String id, Object adapter);
}
public class UsernamePasswordLoginAdapter implements LoginAdapter {
@Override
public boolean supports(Object adapter) {
return adapter instanceof UsernamePasswordLoginAdapter;
}
@Override
public ResultMsg login(String id, Object adapter) {
//....
return ResultMsg("200", "ok", new Object());
}
}
public class GitHubLoginAdapter implements LoginAdapter {
@Override
public boolean supports(Object adapter) {
return adapter instanceof GitHubLoginAdapter;
}
@Override
public ResultMsg login(String id, Object adapter) {
//....
return ResultMsg("200", "ok", new Object());
}
}
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class LoginService {
private final List<LoginAdapter> loginAdapters;
public LoginService(List<LoginAdapter> loginAdapters) {
this.loginAdapters = loginAdapters;
}
public String login(String id, Object adapter) {
for (LoginAdapter loginAdapter : loginAdapters) {
if (loginAdapter.supports(adapter)) {
return loginAdapter.login(id, adapter);
}
}
throw new IllegalArgumentException("No suitable login adapter found");
}
}
// 不同的支付方式也类似
对象适配器
* 对象适配器一般用于使用接口扩展原有的系统,在这种情况下,若有条件应进行重构
接口适配器
* 接口适配器在 Spring 中大多已经被废弃,但其思想仍可在许多类中体现
// 简单来说接口适配器是提供一个抽象类,让子类去重写子类感兴趣的方法
public interface WebMvcConfigurer {
default void configurePathMatch(PathMatchConfigurer configurer) {
}
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
default void addFormatters(FormatterRegistry registry) {
}
default void addInterceptors(InterceptorRegistry registry) {
}
default void addResourceHandlers(ResourceHandlerRegistry registry) {
}
default void addCorsMappings(CorsRegistry registry) {
}
default void addViewControllers(ViewControllerRegistry registry) {
}
default void configureViewResolvers(ViewResolverRegistry registry) {
}
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
}
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}
@Nullable
default Validator getValidator() {
return null;
}
@Nullable
default MessageCodesResolver getMessageCodesResolver() {
return null;
}
}