Adapter-适配器模式

作者: oneWeekOneTopic | 来源:发表于2018-06-08 10:43 被阅读10次

    解决问题

    所谓适配器模式,类似于电脑的各种端口,例如USB,只要实现了USB协议的终端都可以在电脑上使用,只需要提供相应的驱动(Adaptor)即可。Adaptor的目的就是屏蔽各种差异,使核心业务不受输入输出的影响。

    它主要是解决代码耦合的问题,使业务之间能够很好的隔离;核心业务代码可以更加集中的管理,并可以使用适配器供多种类型的客户端调用。

    应用场景

    业务隔离或一个核心业务需要提供给多种不同类型的客户端。比较有名的例子是:“六边形架构”,它很好地使用adaptor将输入输出与信心业务相隔离。

    也有可能是返过来的一种情况,多种核心业务需要根据参数调整业务逻辑,使这种业务逻辑对外不可见。

    原理图

    image
    • Target 对外接口
    • Adapter 适配器,屏蔽内外差异
    • Adaptee 被适合的角色

    示例

    一个在工作中会经常遇到的问题:我们有一个业务,比如展示用户信息。它既需要在APP上展示(http/https)接口;公司的其它也需要用这个信息,则需要为内部提供一个接口(通常是RPC,比如thrift),我们这里采用一个适配器来解决这个问题。

    public interface UserInfo<T, R> {
        public T getUserInfo(R request);
    }
    public class UserCoreBussiness {
    
        public UserCoreResponse getUserInfo() {
            return new UserCoreResponse();
        }
    
        public static class UserCoreRequest {
    
        }
    
        public static class UserCoreResponse {
    
        }
    }
    public class HttpAdaptor implements UserInfo<String, HttpServletRequest> {
        @Override
        public String getUserInfo(HttpServletRequest request) {
            // HttpServletRequest 转换成核心请求参数
            this.buildRequest(request);
            UserCoreBussiness.UserCoreResponse response = new UserCoreBussiness().getUserInfo();
    
            return this.changeResponse(response);
        }
    
        private UserCoreBussiness.UserCoreRequest buildRequest(HttpServletRequest request) {
            return new UserCoreBussiness.UserCoreRequest();
        }
    
        private String changeResponse(UserCoreBussiness.UserCoreResponse response) {
            return response.toString();
        }
    }
    public class ThriftAdptor implements UserInfo<Object, Object> {
        @Override
        public Object getUserInfo(Object request) {
            // HttpServletRequest 转换成核心请求参数
            this.buildRequest(request);
            //  核心业务
            UserCoreBussiness.UserCoreResponse response = new UserCoreBussiness().getUserInfo();
            // 转换成对应的输出
            return this.changeResponse(response);
        }
    
        private UserCoreBussiness.UserCoreRequest buildRequest(Object request) {
            return new UserCoreBussiness.UserCoreRequest();
        }
    
        private Object changeResponse(UserCoreBussiness.UserCoreResponse response) {
            return new Object();
        }
    }
    

    参考

    https://en.wikipedia.org/wiki/Adapter_pattern

    相关文章

      网友评论

        本文标题:Adapter-适配器模式

        本文链接:https://www.haomeiwen.com/subject/yybosftx.html