Adapter-介面卡模式

fulton發表於2019-02-20

解決問題

所謂介面卡模式,類似於電腦的各種埠,例如USB,只要實現了USB協議的終端都可以在電腦上使用,只需要提供相應的驅動(Adaptor)即可。Adaptor的目的就是遮蔽各種差異,使核心業務不受輸入輸出的影響。

它主要是解決程式碼耦合的問題,使業務之間能夠很好的隔離;核心業務程式碼可以更加集中的管理,並可以使用介面卡供多種型別的客戶端呼叫。

應用場景

業務隔離或一個核心業務需要提供給多種不同型別的客戶端。比較有名的例子是:“六邊形架構”,它很好地使用adaptor將輸入輸出與信心業務相隔離。

也有可能是返過來的一種情況,多種核心業務需要根據引數調整業務邏輯,使這種業務邏輯對外不可見。

原理圖

Adapter-介面卡模式

  • 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

相關文章