• 适配器模式


    1. public interface AdvancedMediaPlayer {
    2. public void playVlc(String fileName);
    3. public void playMp4(String fileName);
    4. }
    1. public interface MediaPlayer {
    2. public void play(String audioType, String fileName);
    3. }
    1. public class VlcPlayer implements AdvancedMediaPlayer{
    2. @Override
    3. public void playVlc(String fileName) {
    4. System.out.println("Playing vlc file. Name: "+ fileName);
    5. }
    6. @Override
    7. public void playMp4(String fileName) {
    8. //什么也不做
    9. }
    10. }
    1. public class Mp4Player implements AdvancedMediaPlayer{
    2. @Override
    3. public void playVlc(String fileName) {
    4. //什么也不做
    5. }
    6. @Override
    7. public void playMp4(String fileName) {
    8. System.out.println("Playing mp4 file. Name: "+ fileName);
    9. }
    10. }

     

    1. public class MediaAdapter implements MediaPlayer {
    2. AdvancedMediaPlayer advancedMusicPlayer;
    3. public MediaAdapter(String audioType){
    4. if(audioType.equalsIgnoreCase("vlc") ){
    5. advancedMusicPlayer = new VlcPlayer();
    6. } else if (audioType.equalsIgnoreCase("mp4")){
    7. advancedMusicPlayer = new Mp4Player();
    8. }
    9. }
    10. @Override
    11. public void play(String audioType, String fileName) {
    12. if(audioType.equalsIgnoreCase("vlc")){
    13. advancedMusicPlayer.playVlc(fileName);
    14. }else if(audioType.equalsIgnoreCase("mp4")){
    15. advancedMusicPlayer.playMp4(fileName);
    16. }
    17. }
    18. }
    1. public class AudioPlayer implements MediaPlayer {
    2. MediaAdapter mediaAdapter;
    3. @Override
    4. public void play(String audioType, String fileName) {
    5. //播放 mp3 音乐文件的内置支持
    6. if(audioType.equalsIgnoreCase("mp3")){
    7. System.out.println("Playing mp3 file. Name: "+ fileName);
    8. }
    9. //mediaAdapter 提供了播放其他文件格式的支持
    10. else if(audioType.equalsIgnoreCase("vlc")
    11. || audioType.equalsIgnoreCase("mp4")){
    12. mediaAdapter = new MediaAdapter(audioType);
    13. mediaAdapter.play(audioType, fileName);
    14. }
    15. else{
    16. System.out.println("Invalid media. "+
    17. audioType + " format not supported");
    18. }
    19. }
    20. }

     

    1. public class AdapterPatternDemo {
    2. public static void main(String[] args) {
    3. AudioPlayer audioPlayer = new AudioPlayer();
    4. audioPlayer.play("mp3", "beyond the horizon.mp3");
    5. audioPlayer.play("mp4", "alone.mp4");
    6. audioPlayer.play("vlc", "far far away.vlc");
    7. audioPlayer.play("avi", "mind me.avi");
    8. }
    9. }

    Playing mp3 file. Name: beyond the horizon.mp3
    Playing mp4 file. Name: alone.mp4
    Playing vlc file. Name: far far away.vlc
    Invalid media. avi format not supported
     

     

    适配器模式(Adapter Pattern) 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。

    spring AOP中的适配器模式

    我们知道 Spring AOP 的实现是基于代理模式,但是 Spring AOP 的增强或通知(Advice)使用到了适配器模式,与之相关的接口是AdvisorAdapter 。Advice 常用的类型有:BeforeAdvice(目标方法调用前,前置通知)、AfterAdvice(目标方法调用后,后置通知)、AfterReturningAdvice(目标方法执行结束后,return之前)等等。每个类型Advice(通知)都有对应的拦截器:MethodBeforeAdviceInterceptorAfterReturningAdviceAdapterAfterReturningAdviceInterceptor。Spring预定义的通知要通过对应的适配器,适配成 MethodInterceptor接口(方法拦截器)类型的对象(如:MethodBeforeAdviceInterceptor 负责适配 MethodBeforeAdvice)。

    spring MVC中的适配器模式

    在Spring MVC中,DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由HandlerAdapter 适配器处理。HandlerAdapter 作为期望接口,具体的适配器实现类用于对目标类进行适配,Controller 作为需要适配的类。

    为什么要在 Spring MVC 中使用适配器模式? Spring MVC 中的 Controller 种类众多,不同类型的 Controller 通过不同的方法来对请求进行处理。如果不利用适配器模式的话,DispatcherServlet 直接获取对应类型的 Controller,需要的自行来判断,像下面这段代码一样:

    1. if(mappedHandler.getHandler() instanceof MultiActionController){  
    2.    ((MultiActionController)mappedHandler.getHandler()).xxx  
    3. }else if(mappedHandler.getHandler() instanceof XXX){  
    4.     ...  
    5. }else if(...){  
    6.    ...  
    7. }  

    假如我们再增加一个 Controller类型就要在上面代码中再加入一行 判断语句,这种形式就使得程序难以维护,也违反了设计模式中的开闭原则 – 对扩展开放,对修改关闭。

  • 相关阅读:
    Python考核内容
    软件测试书单/书籍推荐(整理更新中)
    音视频开发项目:H.265播放器:视频解码篇
    性能优化-卡顿优化-tarce抓取及分析
    【云原生之Docker实战】使用Docker部署jenkins持续集成工具
    micro-app-源码3-样式隔离篇
    线程和进程的优缺点
    中国大陆IP段(含港澳)【2024-04-25】APNIC lasted 2024-04-25
    (CVPR 2019) PointConv: Deep Convolutional Networks on 3D Point Clouds
    必知必会,7 张图轻松理解 K8S 集群内服务通信
  • 原文地址:https://blog.csdn.net/weixin_53150299/article/details/132812752