解決問題
所謂介面卡模式,類似於電腦的各種埠,例如USB,只要實現了USB協議的終端都可以在電腦上使用,只需要提供相應的驅動(Adaptor)即可。Adaptor的目的就是遮蔽各種差異,使核心業務不受輸入輸出的影響。
它主要是解決程式碼耦合的問題,使業務之間能夠很好的隔離;核心業務程式碼可以更加集中的管理,並可以使用介面卡供多種型別的客戶端呼叫。
應用場景
業務隔離或一個核心業務需要提供給多種不同型別的客戶端。比較有名的例子是:“六邊形架構”,它很好地使用adaptor將輸入輸出與信心業務相隔離。
也有可能是返過來的一種情況,多種核心業務需要根據引數調整業務邏輯,使這種業務邏輯對外不可見。
原理圖
- 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