デザインパターン(5)アダプターパターン

アダプターモード

概念

  1. アダプタパターンは、互換性のない2つのインターフェイス間のブリッジとして機能します。このタイプのデザインパターンは、2つの独立したインターフェイスの機能を組み合わせた構造パターンです。
  2. このモードには、独立した、または互換性のないインターフェイス関数の追加を担当する単一のクラスが含まれます。
  3. システムのインターフェースを別の形式に変換し、直接呼び出すことができないインターフェースを呼び出すことができるようにします。

特徴

  • ソース(適応者):適応する必要のあるオブジェクトまたはタイプ、古いバージョン、またはメモリカードとノートブックの間のカードリーダー。
  • アダプター:ターゲットとソースを接続する中間オブジェクト。これはコンバーターに相当し、新旧バージョンは互換性があります。
  • ターゲット:顧客が期待するインターフェース。ターゲットは、具象クラスまたは抽象クラス、あるいはインターフェースです。

使用するシーン

新旧バージョンのインターフェースの互換性。

長所と短所

  • 利点

    1. 無関係な2つのクラスを一緒に旅行させることができます。
    2. クラスの再利用が改善されました。
    3. クラスの透明性が向上しました。
    4. 優れた柔軟性。
  • 不利益

    1. アダプターを使いすぎると、システムが非常に乱雑になり、全体として把握しにくくなります。

パターンの構造

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の場合:
    ここに画像の説明を挿入

デザインパターンに関するすべてのコードはホストされます:デザインパターンコード、注意を払うことを歓迎します。

おすすめ

転載: blog.csdn.net/qq_37640410/article/details/108634765