首页 > 其他分享 >设计模式—适配器模式

设计模式—适配器模式

时间:2023-12-22 22:45:07浏览次数:26  
标签:play String 适配器 模式 fileName void audioType 设计模式 public

介绍

代码

接口

定义媒体播放器接口 MediaPlayer,其中 play 方法用于播放媒体文件

public interface MediaPlayer {
    public void play(String audioType, String fileName);
}

定义高级播放器接口 AdvancedMediaPlayer,规定指定类型媒体的播放方法

public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);

    public void playMp4(String fileName);
}

适配器类

引入适配器类 MediaAdapter,实现 MediaPlayer 接口, 包含成员 AdvancedMediaPlayer。这样在调用 MediaPlayerplay 方法的时候,可以转接到 AdvancedMediaPlayerplayVlc 方法和 playMp4 方法,这就是适配器类的作用:表面上 A 类的行为,用户不知道调用的实际是 B 类,也就是适配器类完成了两个类行为的对接

public class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String autioType) {
        if(autioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        } else if(autioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        } else if(audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}

实体类

实体类 AudioPlayer 实现 MediaPlayer 接口

public class AudioPlayer implements MediaPlayer {
    MediaPlayer mediaPlayer;

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file. Name: " + fileName);
        } else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaPlayer = new MediaAdapter(audioType);
            mediaPlayer.play(audioType, fileName);
        }else{
            System.out.println("Invalid media.");
        }
    }
}

AdvancedMediaPlayer 接口的两个实现类 Mp4PlayerVlcPlayer

public class Mp4Player implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
        // do nothing
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}
public class VlcPlayer implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // do nothing
    }
}

测试

public class AdapterTest {
    @Test
    void test() {
        AudioPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3", "beyond the horizon.mp3");
        audioPlayer.play("mp4", "alone.mp4");
        audioPlayer.play("vlc", "far far away.vlc");
        audioPlayer.play("avi", "mind me.avi");
    }
}

标签:play,String,适配器,模式,fileName,void,audioType,设计模式,public
From: https://www.cnblogs.com/shixuanliu/p/17922461.html

相关文章

  • 一文看懂java单例模式
    ​ Java单例模式是一种常用的创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在Java中,有多种方式可以实现单例模式,下面详细介绍其中的几种常见实现方式。1什么是创建型设计模式?处理对象创建的模式,简答的理解就是如何创建对象?很多人都会想到new......
  • 在 Linux 上以 All-in-One 模式安装 KubeSphere
    1、什么是KubeSphere KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的IT自动化运维能力,简化企业的DevOps工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)......
  • javaweb中的设计模式
    1.监听器基于观察者模式。1.myTestEvent自定义事件。被观察者publicclassMyTestEventextendsApplicationEvent2.MyNoAnnotationListener自定义监听器。观察者@ComponentpublicclassMyNoAnnotationListenerimplementsApplicationListener<MyTestEvent>{@Override......
  • 责任链模式
    #include<iostream>#include<string>#include<sstream>usingnamespacestd;template<classT>stringMyConvertToString(Tvalue){stringstreamss;ss<<value;returnss.str();}//顶层的抽象类,规范了击鼓传花的组合能力classH......
  • 策略模式:让你的代码灵活应对不同场景
    写在前面如果你正在为代码的可扩展性和可维护性感到烦恼,策略模式可以成为你的得力助手。本篇技术文章详细介绍了策略模式的核心原理和实战应用,帮助你解决在程序设计中所面临的挑战。无论你是初学者还是有一定经验的开发者,这篇文章都能够为你提供有益的知识和实用的技巧,值得一读!前......
  • 设计模式之工厂模式
    工厂模式(工厂模式)工厂将创建对象的细节抽离出来,实现对修改关闭。定义==工厂方法模式==定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。工厂模式有3种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。工厂......
  • Tita丨升级看板模式
    看板模式价值:看板模式可以灵活的对任务进行分类和管理,可以根据项目的需要,来创建不同的看板,根据看板,来把任务进行清晰的分类。对于任务和看板可以进行灵活的拖拽,以此来重新设置任务或看板的位置,它比里程碑对任务的展示更加轻量~Tita-OKR和新绩效一体化管理平台该如何来玩转看......
  • 微服务广播模式实践:维护内存数据的缓存一致性
    本文分享自华为云社区《微服务广播模式实践》,作者:张俭。微服务广播模式,指的是在微服务多实例部署的场景下,将消息广播到多个微服务实例的一种模式。广播模式,一般用来维护微服务的内存数据,根据数据类型的不同,有助于解决两类问题。通常广播模式会使用支持发布订阅的消息中间件实......
  • 官宣!DevExpress Blazor UI组件,支持全新的.NET 8渲染模式
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。.NET8为Blazor引入了令人兴奋的重大变化,统一了它的托管模型,并采用了服务器......
  • 中西方全面预算模式异同点
    说说全面预算:凡事预则立,不预则费,中西方在管理思想上有很多方面是不怎么相同的欧美公司做法:无预算不执行,执行的是刚性预算谁的预算谁使用,便于后续考核分析,比如有的公司能预算到每一张打印纸,你用完了只能去找别的组织去借注重分析控制,国外的全面预算软件,比如hyperionplanning,c......