• 设计模式—结构型模式之适配器模式


    设计模式—结构型模式之适配器模式

    将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

    别名也可以是Wrapper,包装器。

    适配器模式(Adapter)包含以下主要角色。

    • 目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口。
    • 适配者(Adaptee)类:隐藏的转换接口。
    • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。

    举例

    比如我们需要一个播放器类,可以根据不同的国家提供相应字幕的功能。我们不应该修改播放器,我们需要写一个适配器类,来进行字幕转换。

    播放电影接口如下:

    /**
     * 提供原有接口,可以播放电影,并且返回字幕
     */
    public interface Player {
        String play();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    电影播放器类如下:

    /**
     * 电影播放器
     */
    public class MoviePlayer implements Player{
        @Override
        public String play() {
            String content = "你好,世界!";
            //打印字幕
            System.out.println(content);
            return content;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果是我们自己看的话,直接进行如下操作即可:

    public class AdapatorTest {
        public static void main(String[] args) {
            MoviePlayer moviePlayer = new MoviePlayer();
            moviePlayer.play();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    但是如果有一个以英文为语言的人来看的话,就不行了。

    所以我们需要一个适配器,来为英文适配。

    翻译文本内容的接口如下:

    /**
     * 提供接口,翻译文本内容
     */
    public interface Translator {
        String translate(String content);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    中文翻译为英文的类如下;

    /**
     * 中文---》英文的翻译器
     */
    public class ZhToEnTranslator implements Translator{
        /**
         * 简单示意翻译
         * @param content 需要翻译的内容
         * @return  翻译的内容
         */
        @Override
        public String translate(String content) {
            //省略判空
            if(content.contains("你好")){
                content = content.replace("你好","Hello");
            }
            if(content.contains("世界")){
                content = content.replace("世界","World");
            }
            return content;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行如下:

    运行截图

    类适配器

    使用继承的方式来进行适配。

    英文适配器如下:

    /**
     * 做英文适配
     */
    public class EnglishMoviePlayerAdapter extends ZhToEnTranslator implements Player {
        //被适配对象
        private Player target;
    
        public EnglishMoviePlayerAdapter(Player target) {
            this.target = target;
        }
    
        @Override
        public String play() {
            String play = target.play();
            //翻译
            String translate = translate(play);
            System.out.println("English:"+translate);
            return translate;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    测试如下:

    public class ClazzAdapaterTest {
        public static void main(String[] args) {
            MoviePlayer moviePlayer = new MoviePlayer();
            EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
            englishMoviePlayerAdapter.play();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行如下:

    运行截图

    对象组合适配器

    使用对象组合的方法来进行适配

    /**
     * 做英文适配
     */
    public class EnglishMoviePlayerAdapter implements Player {
        
        private Translator translator = new ZhToEnTranslator();
        
        //被适配对象
        private Player target;
    
        public EnglishMoviePlayerAdapter(Player target) {
            this.target = target;
        }
    
        @Override
        public String play() {
            String play = target.play();
            //翻译
            String translate = translator.translate(play);
            System.out.println("English:"+translate);
            return translate;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    测试类如下:

    public class ObjAdapaterTest {
        public static void main(String[] args) {
            MoviePlayer moviePlayer = new MoviePlayer();
            EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
            englishMoviePlayerAdapter.play();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行如下:

    运行截图

  • 相关阅读:
    “不敢去怀疑代码,又不得不怀疑代码”记一次网络请求超时分析
    如何实现Android视音频数据对接到GB28181平台(SmartGBD)
    MySQL-1(12000字详解)
    Qt之自定义事件QEvent
    文件名批量重命名与翻译的实用指南
    音视频技术开发周刊 | 315
    “互联网寒冬”来袭,软件测试人员该如何度过这次危机?
    Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
    【毕业设计】基于javaEE+原生Servlet+MySql的业务绩效考核系统设计与实现(毕业论文+程序源码)——业务绩效考核系统
    基于JavaSwing开发房产管理系统(access数据库) 课程设计 大作业
  • 原文地址:https://blog.csdn.net/qq_41243472/article/details/134218109