首页 > 其他分享 >设计模式—结构型模式之适配器模式

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

时间:2023-11-04 14:58:46浏览次数:35  
标签:play String 适配 适配器 模式 content 设计模式 public

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

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

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

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

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

举例

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

播放电影接口如下:

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

电影播放器类如下:

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

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

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

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

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

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

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

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

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

运行如下:

运行截图

类适配器

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

英文适配器如下:

/**
 * 做英文适配
 */
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;
    }
}

测试如下:

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

运行如下:

运行截图

对象组合适配器

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

/**
 * 做英文适配
 */
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;
    }
}

测试类如下:

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

运行如下:

运行截图

标签:play,String,适配,适配器,模式,content,设计模式,public
From: https://www.cnblogs.com/nicaicai/p/17809323.html

相关文章

  • 企业集成模式-第二章
    二、集成模式2.1引言企业集成是指让不同的应用协同工作,提供一组统一的功能。这些应用可以是内部定制开发的,也可以从第三方开发商购买。它们可能运行在多台计算机上,分别有不同的平台,甚至在地理位置上也是分散的。有些应用可能由企业外的商业合作伙伴或客户运行。还有些应用在设......
  • 企业集成模式-第三章
    三、消息传递系统3.1引言1)消息传递的基本概念通道:是一个虚拟管道消息:能通过通道传送的一个原子数据包管道和过滤器:在最简单的情况下,消息传递系统会把消息直接从发送者的计算机传送给接收者的计算机。但是,在消息从最初的发送者那里发出,直到最后的接收者接收到以前,往往需要对......
  • 设计模式
    一、工厂模式1、简单工厂模式通过一个具体的工厂类,根据传入不同的参数,生成实际对象2、工厂方法模式在工厂方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体的产品创建。当增加一个产品时,只需增加一个相应的工厂类的子类,实现生产这种产品,从而解决简单工厂生产......
  • 软件设计实验7:单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图;  2......
  • 软件设计实验6:原型模式
     实验6:原型模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解原型模式的动机,掌握该模式的结构;2、能够利用原型模式解决实际问题。 [实验任务一]:向量的原型用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量......
  • virtual box nat模式ssh到虚拟机
    设置端口转发,然后就可以从主机直接ssh到虚拟机然后主机如下操作即可[email protected]......
  • Rabbitmq消息队列:Topic话题模式简单应用
    一、生产者声明topic话题模式的交换机,分别发送几条消息到不同的路由key。packagetest.topic;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importutils.RabbitmqConUtil;publicclassGive{//定义交换机privatefinals......
  • Redis 哨兵模式(Sentinel)配置
    哨兵是Redis的一种运行模式,它专注于对Redis实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个Redis系统的可用性。集群演示本次测试为“1主2从”的模式,即一个master两个从节点slave。如下图条件限制,......
  • [vue-router] hash模式与history模式的区别
    单页面应用(SPA)单页面应用程序将所有的活动局限于一个Web页面中,在该Web页面初始化时加载相应的HTML、JavaScript和CSS。一旦页面加载完成,单页面应用不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用JavaScript动态的变换HTML的内容,从而实现UI与用户的交互。由......
  • 范围适配器的编译时大小
    与标准不同,think-cell的范围库已经原生支持编译时大小,因此我渴望尝试那里的习惯用法,看看它在实践中的效果如何。 namespacetc{ template<typenameRng> constexprautosize(Rng&&rng);//runtime-sizeofarange,likestd::ranges::size template<typename......