设计模式 适配器模式

适配器模式

* 核心思想:让每一种类型的对象通过一个适配器接口,获得对应的处理器,再让对应的处理器去做对应的
  进而处理优化 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;
    }
}
  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值