23种设计模式-java

Adapter-适配器模式

2018-06-08  本文已影响10人  oneWeekOneTopic

解决问题

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

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

应用场景

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

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

原理图

image

示例

一个在工作中会经常遇到的问题:我们有一个业务,比如展示用户信息。它既需要在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

上一篇下一篇

猜你喜欢

热点阅读