适配器模式

适配器模式(Adapter Pattern)

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

别名也可以是Wrapper,包装器

适配器模式的主要角色

  • Target(目标接口):这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • Adaptee (被适配者/适配对象):需要适配的类,它的接口与Target接口不兼容。
  • Adapter (适配器):通过包装一个Adaptee实例来实现Target接口。适配器把Adaptee的接口转换成Target接口。

案例

电影播放器接口及其实现类:

java 复制代码
public interface Player {
    String play();
}
java 复制代码
public class MoviePlayer implements Player{
    @Override
    public String play() {
        System.out.println("正在播放电影");
        String content = "你好";
        return content;
    }
}

现在需要一个翻译器将中文翻译成英文:

java 复制代码
public interface Translater {
    String translate(String content);
}
java 复制代码
public class ZH_ENGTranslater implements Translater{
    @Override
    public String translate(String content) {
        if("你好".equals(content)){
            return "hello";
        }
        return "";
    }
}

在不改变原有接口的条件下使用适配器完成翻译:

1)类结构模式:

java 复制代码
public class EnglishMovieAdaptor extends ZH_ENGTranslater implements Player {
    MoviePlayer player;

    EnglishMovieAdaptor(MoviePlayer player){
        this.player = player;
    }

    @Override
    public String play() {
        String content = player.play();
        String translate = translate(content);
        return translate;
    }
}

2)对象结构模式(推荐使用):

java 复制代码
public class EnglishMovieAdaptor01 implements Player {
    private static ZH_ENGTranslater translater = new ZH_ENGTranslater();

    MoviePlayer player;

    EnglishMovieAdaptor01(MoviePlayer player){
        this.player = player;
    }

    @Override
    public String play() {
        String content = player.play();
        String translate = translater.translate(content);
        return translate;
    }
}
相关推荐
JIngJaneIL1 分钟前
停车场管理|停车预约管理|基于Springboot+的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·notepad++·停车场管理|
2401_8370885012 分钟前
在 IDEA 中启动同一个项目的两个实例,让idea底层配置两个Tomcat 服务器
java·服务器·intellij-idea
记录Java学习的三木16 分钟前
IDEA终端中使用Maven和右侧边栏使用IDEA的Maven插件有什么区别
java·maven·intellij-idea
乘乘凉17 分钟前
C#中的值传递和引用传递
java·开发语言·c#
ThreeYear_s21 分钟前
【FPGA+DSP系列】——MATLAB simulink单相PWM全控整流电路基础版
开发语言·matlab·fpga开发
kaikaile199526 分钟前
基于高斯白噪声与瑞利衰落共同作用的OFDM系统仿真
开发语言·matlab
Seven9731 分钟前
SpringCloud 常见面试题(二)
java
zwm_yy34 分钟前
php常用函数
开发语言·php·restful
CPU NULL1 小时前
Redis相关知识点总结
java·数据库·spring boot·redis·缓存
晨晖21 小时前
Spring Boot整合Spring MVC与外部配置完整笔记
java·spring boot·后端