アダプターモード
概念
- アダプタパターンは、互換性のない2つのインターフェイス間のブリッジとして機能します。このタイプのデザインパターンは、2つの独立したインターフェイスの機能を組み合わせた構造パターンです。
- このモードには、独立した、または互換性のないインターフェイス関数の追加を担当する単一のクラスが含まれます。
- システムのインターフェースを別の形式に変換し、直接呼び出すことができないインターフェースを呼び出すことができるようにします。
特徴
- ソース(適応者):適応する必要のあるオブジェクトまたはタイプ、古いバージョン、またはメモリカードとノートブックの間のカードリーダー。
- アダプター:ターゲットとソースを接続する中間オブジェクト。これはコンバーターに相当し、新旧バージョンは互換性があります。
- ターゲット:顧客が期待するインターフェース。ターゲットは、具象クラスまたは抽象クラス、あるいはインターフェースです。
使用するシーン
新旧バージョンのインターフェースの互換性。
長所と短所
-
利点
- 無関係な2つのクラスを一緒に旅行させることができます。
- クラスの再利用が改善されました。
- クラスの透明性が向上しました。
- 優れた柔軟性。
-
不利益
- アダプターを使いすぎると、システムが非常に乱雑になり、全体として把握しにくくなります。
パターンの構造
SpringMvcは、比較的柔軟な構成とシンプルな実装を備えた優れたフレームワークです。今日は、適応プロセスとアダプターの簡単な使用法をシミュレートします。
開発ステップ
- SpringMvcのDispatcherServletオブジェクトをシミュレートして、リクエストをディスパッチします。以下に示すように、それと同じdoServiceメソッドも記述します。
メソッド内で、doDispatchメソッドを呼び出します
すべてのアダプタオブジェクトから、このリクエストハンドラに対応するものだけを選択します
getHandlerAdapterメソッド内で、アダプターのsupportsメソッドを呼び出して、要求ハンドラーがサポートされているかどうかを判別します。
大まかにどのHandlerAdapterがありますか?
サポートメソッドがあることを上で見てきました。アダプターメソッドは、主に2つのメソッドを含む統合された親クラスで定義されます。サポートは、対応するハンドラーリクエストがサポートされているかどうかを判断し、
ハンドルは特定のハンドラーリクエスト、以下に示すように見てみましょう:
私はここでも達成するのは難しくないことを見てきました。さあ始めましょう。
DispatcherServletと同様の処理クラスを定義します
package com.lee.adapter.controller;
import com.lee.adapter.service.HandlerAdapter;
import com.lee.adapter.service.impl.RequestMappingHandlerAdapter;
import com.lee.adapter.service.impl.SimpleHandlerAdapter;
import com.lee.adapter.service.impl.SimpleServletHandlerAdapter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zfl_a
* @Desc 入口测试
* @date 2020/8/16
* @project springboot_design_pattern
*/
@RestController
public class DispatcherController implements InitializingBean {
//自动装配
@Autowired
private Map<String,Controller> controllerMap = new HashMap<>();
private List<HandlerAdapter> handlerAdapters = new ArrayList<>();
/**
* 处理
* @param controllerName simpleController simpleServletController httpRequestController
* @return
*/
@GetMapping("/doService")
public String doService(String controllerName){
return doDispatcher(controllerName);
}
private String doDispatcher(String controllerName) {
// 获取适配器 参数可根据具体的Handler替换
Controller controller = controllerMap.get(controllerName);
HandlerAdapter ha = getHandlerAdapter(controller);
if(ha == null) {
return "没有此适配器";
}
//具体处理
return ha.handle(controller);
}
/**
* 获取适配器
* @param controller
* @return
*/
private HandlerAdapter getHandlerAdapter(Controller controller) {
if (this.handlerAdapters != null) {
for (HandlerAdapter ha : this.handlerAdapters) {
if (ha.supports(controller)) {
return ha;
}
}
}
return null ;
}
@Override
public void afterPropertiesSet() throws Exception {
//初始化适配器实例
RequestMappingHandlerAdapter mappingHandlerAdapter = new RequestMappingHandlerAdapter();
SimpleHandlerAdapter simpleHandlerAdapter = new SimpleHandlerAdapter();
SimpleServletHandlerAdapter servletHandlerAdapter = new SimpleServletHandlerAdapter();
handlerAdapters.add(mappingHandlerAdapter);
handlerAdapters.add(simpleHandlerAdapter);
handlerAdapters.add(servletHandlerAdapter);
}
}
- シミュレーションコントローラーリクエストクラス
共通のコントローラーを定義し、何もしない
package com.lee.adapter.controller;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
public interface Controller {
}
対応する実装クラスを定義し、特定の処理を実行します
package com.lee.adapter.controller;
import org.springframework.stereotype.Component;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
@Component
public class HttpRequestController implements Controller {
public String doRequestMapping(){
return "do http request ....";
}
}
package com.lee.adapter.controller;
import org.springframework.stereotype.Component;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
@Component
public class SimpleController implements Controller {
public String doSimple(){
return "do simple ....";
}
}
package com.lee.adapter.controller;
import org.springframework.stereotype.Component;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
@Component
public class SimpleServletController implements Controller {
public String doSimpleServlet(){
return "do Simple Servlet....";
}
}
- HandlerAdapterを使用してアダプターインターフェースを定義する
package com.lee.adapter.service;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author zfl_a
* @Desc 所有适配器的父类
* @date 2020/8/16
* @project springboot_design_pattern
*/
public interface HandlerAdapter {
boolean supports(Object handler);
String handle(Object handler) ;
}
- 上記のコントローラーに対応するアダプターを定義します
package com.lee.adapter.service.impl;
import com.lee.adapter.controller.HttpRequestController;
import com.lee.adapter.service.HandlerAdapter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
public class RequestMappingHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof HttpRequestController;
}
@Override
public String handle(Object handler) {
return ((HttpRequestController)handler).doRequestMapping();
}
}
package com.lee.adapter.service.impl;
import com.lee.adapter.controller.SimpleController;
import com.lee.adapter.service.HandlerAdapter;
import org.springframework.stereotype.Component;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
public class SimpleHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof SimpleController;
}
@Override
public String handle(Object handler) {
return ((SimpleController)handler).doSimple();
}
}
package com.lee.adapter.service.impl;
import com.lee.adapter.controller.SimpleServletController;
import com.lee.adapter.service.HandlerAdapter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
/**
* @author zfl_a
* @date 2020/8/16
* @project springboot_design_pattern
*/
public class SimpleServletHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof SimpleServletController;
}
@Override
public String handle(Object handler) {
return ((SimpleServletController)handler).doSimpleServlet();
}
}
テスト結果は次のとおりです。
-
リクエストパラメータが?controllerName = simpleServletControllerの場合:
-
リクエストパラメータが?controllerName = httpRequestControllerの場合:
デザインパターンに関するすべてのコードはホストされます:デザインパターンコード、注意を払うことを歓迎します。