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

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

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

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

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

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

举例

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

播放电影接口如下:

java 复制代码
/**
 * 提供原有接口,可以播放电影,并且返回字幕
 */
public interface Player {
    String play();
}

电影播放器类如下:

java 复制代码
/**
 * 电影播放器
 */
public class MoviePlayer implements Player{
    @Override
    public String play() {
        String content = "你好,世界!";
        //打印字幕
        System.out.println(content);
        return content;
    }
}

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

java 复制代码
public class AdapatorTest {
    public static void main(String[] args) {
        MoviePlayer moviePlayer = new MoviePlayer();
        moviePlayer.play();
    }
}

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

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

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

java 复制代码
/**
 * 提供接口,翻译文本内容
 */
public interface Translator {
    String translate(String content);
}

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

java 复制代码
/**
 * 中文---》英文的翻译器
 */
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;
    }
}

运行如下:

类适配器

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

英文适配器如下:

java 复制代码
/**
 * 做英文适配
 */
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;
    }
}

测试如下:

java 复制代码
public class ClazzAdapaterTest {
    public static void main(String[] args) {
        MoviePlayer moviePlayer = new MoviePlayer();
        EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
        englishMoviePlayerAdapter.play();
    }
}

运行如下:

对象组合适配器

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

java 复制代码
/**
 * 做英文适配
 */
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;
    }
}

测试类如下:

java 复制代码
public class ObjAdapaterTest {
    public static void main(String[] args) {
        MoviePlayer moviePlayer = new MoviePlayer();
        EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
        englishMoviePlayerAdapter.play();
    }
}

运行如下:

相关推荐
小灰灰要减肥16 分钟前
装饰者模式
java
张铁铁是个小胖子27 分钟前
MyBatis学习
java·学习·mybatis
诸葛悠闲1 小时前
设计模式——桥接模式
设计模式·桥接模式
Yan.love1 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶1 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥1 小时前
java提高正则处理效率
java·开发语言
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101342 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob3 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存